OC利用Runtime运行时变成一门动态语言
Runtime中的可以解决的问题:
1.为分类增加属性
常规定义 @property,编译器会为我们做3个处理:
生成实例变量_ property
生成getter和setter
但是分类中并不会去帮我们实现这些,所以通过关联对象去将键值关联到对象上面去
示例代码如下:
@property (nonatomic, strong) NSString *title;
-
(NSString *)title {
return objc_getAssociatedObject(self, _cmd);
} -
(void)setTitle:(NSString *)title {
objc_setAssociatedObject(self, @selector(title), title, OBJC_ASSOCIATION_RETAIN);
}
2.实现方法交换
在不想原有的功能下增加一些特殊的功能
3.利用class_copyIvarList 实现NSCoding的归档和解归档
class_copyIvarList 此方法可以获取对象中的成员列表变量,然后利用KVO来实现encodeWithCoder、initWithCoder这两个方法
4.不仅如此,还可以实现消息消息转发的机制
oc 通过obj_message的方式发送消息的,当对象收到无法处理的消息的时候,会执行消息转发,转发的步骤如下:
1.调用resolveInstanceMethod 方法,实现动态方法解析。这里会给类使用class_addMethod 来增加方法的机会。
2.如果没有实现动态方法解析,可调用 forwardingTargetForSelector 方法,看是否有备用接收者,将消息转发给备用接收者处理。
3.如果没有对象来接受此消息,处理不了了,就转发出去。
调用 methodSignatureForSelector 和 forwardInvocation 方法,进行完成的消息转发
如果经过上面三个步骤,还不能正确处理消息,程序就会走 doesNotRecognizeSelector 方法,crash 掉。
网友评论