美文网首页
iOS轻松给类添加属性

iOS轻松给类添加属性

作者: homosum | 来源:发表于2017-01-13 11:52 被阅读0次

    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_setAssociatedObjectobjc_getAssociatedObject方法。

    E7D3A73A-4100-4ED2-918E-A1C1FA4E252E.png
    用一个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);

    相关文章

      网友评论

          本文标题:iOS轻松给类添加属性

          本文链接:https://www.haomeiwen.com/subject/alqupttx.html