美文网首页
利用runtime来实现给分类添加属性

利用runtime来实现给分类添加属性

作者: guoguojianshu | 来源:发表于2018-11-20 11:19 被阅读1次

    在<objc/runtime.h>中定义了三个关联对象的方法,可以允许你把任何键值关联到运行的对象上

    ·objc_setAssociatedObject
    .objc_getAssociatedObject
    .objc_removeAssociatedObjects

    通常推荐添加的属性是static char 类型的,但是更推荐指针类型的

    static char类型的例子

    #import "ViewController.h"
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface ViewController (associate)
    @property (nonatomic,copy)NSString * type;
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "ViewController+associate.h"
    #import <objc/runtime.h>
    static const char key ;
    @implementation ViewController (associate)
    -(NSString *)type{
        return objc_getAssociatedObject(self, &key);
    }
    -(void)setType:(NSString *)type{
        objc_setAssociatedObject(self, &key, type, OBJC_ASSOCIATION_RETAIN);
    }
    @end
    

    使用指针的情况,只是.m的文件设置的key进行了改变

    #import "ViewController+associate.h"
    #import <objc/runtime.h>
    static const char *key = "key";
    @implementation ViewController (associate)
    -(NSString *)type{
        return objc_getAssociatedObject(self, key);
    }
    -(void)setType:(NSString *)type{
        objc_setAssociatedObject(self, key, type, OBJC_ASSOCIATION_RETAIN);
    }
    @end
    

    当然最最简单的方式是使用@selector,_cmd在Objective-C的方法中表示当前方法的selector

    #import "ViewController+associate.h"
    #import <objc/runtime.h>
    @implementation ViewController (associate)
    -(NSString *)type{
        return objc_getAssociatedObject(self, _cmd);
    }
    -(void)setType:(NSString *)type{
        objc_setAssociatedObject(self, @selector(type), type, OBJC_ASSOCIATION_RETAIN);
    }
    @end
    

    关联对象的行为

    属性可以根据定义在枚举类型 objc_AssociationPolicy 上的行为被关联在对象上:


    屏幕快照 2018-11-20 上午11.19.54.png

    删除属性

    你不能手动调用这个函数 objc_removeAssociatedObjects,文档中提到,如果想删除一个属性,可以给这个属性nil

    相关文章

      网友评论

          本文标题:利用runtime来实现给分类添加属性

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