RunTime机制

main.m

在终端进入main.m的同一级目录,使用clang -rewrite main.m编译出main.cpp文件

我们可以看到main函数被编译成如下图的函数:

main.cpp

在消息机制里没有类方法和对象方法这种说辞,都是给对象发送消息。

runtime在程序运行的时候,对某个类动态的添加,修改属性和方法。

Runtime运行时是在iOS代码运行时将其翻译成对应的C语言程序。 

Runtime 运行时是苹果提供的一个API,属于一个C语言的库。那么在iOS开发中,Runtime运行时有什么用呢? 

   1. 利用Runtime运行时,在程序的运行过程中,动态创建一个类。 

   2. 利用Runtime运行时,在程序的运行过程中,动态修改一个类的属性/方法。 

   3. 利用Runtime运行时,遍历一个类的所有的属性和方法。 

用的时候需要导入头文件: objc/runtime.h或objc/message.h(包含了objc/runtime.h)

下面就介绍一下用Runtime运行时来实现KVO的一个过程,基本步骤如下:

   1.动态添加被监听对象类的一个子类;

   2.在该子类中动态添加被监听的属性的set方法,即重写父类的属性的set方法;

   3.当调用被监听的属性的set方法且改属性的值发生改变的时候通知外界。

特别注意: 

一个类的属性赋值形式为object.property = … 

一个类的成员变量赋值形式为object->MemberVariable = … 

KVO不能观察到成员变量的值的变化,因为KVO是动态添加了一个被监听对象类的子类,然后重写了被监听对象类的属性的set方法,在该方法中来做的通知,所以只有调用set方法才能被检测到

使用RunTime实现KVO机制,下面直接上代码:

NSObject+SYKVO.m
NSObject+SYKVO.m
NSObject+SYKVO.m

下面是NSObject+SYKVO的使用:


ViewController.m

使用RunTime交换方法:


NSURL+url.m

在ViewController.m中我们使用代码:NSURL *url = [NSURL URLWithString:@"www.baidu.com"];

    NSLog(@"%@", url);

你可能感兴趣的:(RunTime机制)