
在终端进入main.m的同一级目录,使用clang -rewrite main.m编译出main.cpp文件
我们可以看到main函数被编译成如下图的函数:

在消息机制里没有类方法和对象方法这种说辞,都是给对象发送消息。
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的使用:

使用RunTime交换方法:

在ViewController.m中我们使用代码:NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
NSLog(@"%@", url);
网友评论