runtime:运行时机制,是一种在编译保持不确定状态,运行时再决定调用哪个函数的机制。
将OC与C对比,区别于在编译的时候,C语言中调用未实现的函数会报错,而对于OC,只要函数声明过,有未现实在编译时都不会报错。
在OC中,我们引用原生类时经常会需要给类额外添加属性的情况,有两种解决问题的办法。要添加的属性比较多的话,我们可以自定义一个子类继承于OC原生的父类。但当我们只需要添加很少的属性或修改别人代码且不希望造成很大得改动时,建议使用runtime。
一个通过runtime添加属性实际操作的例子。
[skipButton addTarget:self action:@selector(skipAD:) forControlEvents:UIControlEventTouchUpInside];
skipButton是一个UIButton类,点击后可以直接跳过启动图。现在需要在启动图跳过之后对远程通知进行处理。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
FinishLaunching函数的launchOptions字典里存储了远程通知的内容。
想要将通知内容带到skipAD:
方法中,最方便的做法就是使用runtime(runtime添加属性的轻便和低耦性合非常适合代码修改和维护)。
使用runtime方法需要#import <objc/runtime.h>
,然后看这个“建立联系”的方法。
以下runtime中 objc_setAssociatedObject
和objc_getAssociatedObject
方法。
用一个key和联系策略将需要关联的value和一个给定的object关联起来。
object:被关联(原始母对象)对象
key:关联钥匙
value:需要关联给被关联对象的对象(子属性)
policy:关联策略(子属性的前缀) D0340546-653E-4886-BD47-837A7E81F4F4.png
使用的时候,先全局声明一个key:
static char buttonInfo;
通过key绑定对象
objc_setAssociatedObject(skipButton, &buttonInfo, launchOptions, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
获取对象
objc_getAssociatedObject
就比较简单了
A785D239-84E6-49F7-8B1E-0D4DE6053D42.png
在
-(void)skipAD:(UIButton*)button
中取到launchOptions
NSDictionary*launchOptions=objc_getAssociatedObject(button, &buttonInfo);
网友评论