美文网首页
iOS用runtime给Category添加属性

iOS用runtime给Category添加属性

作者: 爱恨的潮汐 | 来源:发表于2019-04-11 11:49 被阅读0次

    用runtime给Category添加属性

    1、添加属性

    (1)UIViewController+CXHelp.h

    @interface UIViewController (CXHelp)
    
    //在Category中定义属性:controllerId
    @property (nonatomic,copy) NSString * controllerId;
    
    @end
    

    (2)UIViewController+CXHelp.m

    //导入头文件
    #import <objc/runtime.h>
    
    //在setControllerId:方法中使用了一个objc_setAssociatedObject的方法,这个方法有四个参数,分别是:源对象,关联时的用来标记是哪一个属性的key(因为你可能要添加很多属性),关联的对象和一个关联策略。用来标记是哪一个属性的key常见有三种写法,但代码效果是一样的,如下:
    static void *controllerIdKey = &controllerIdKey; //Id的key
    
    @implementation UIViewController (CXHelp)
    #pragma mark ==================用runtime添加属性==========================
    - (NSObject *)controllerId {//get方法
        return objc_getAssociatedObject(self, &controllerIdKey);
    }
    -(void)setControllerId:(NSString *)controllerId{//set方法
        objc_setAssociatedObject(self, &controllerIdKey, controllerId, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    //typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    //    OBJC_ASSOCIATION_ASSIGN = 0,             //关联对象的属性是弱引用
    //    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,   //关联对象的属性是强引用并且关联对象不使用原子性
    //    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,     //关联对象的属性是copy并且关联对象不使用原子性
    //    OBJC_ASSOCIATION_RETAIN = 01401,         //关联对象的属性是copy并且关联对象使用原子性
    //    OBJC_ASSOCIATION_COPY = 01403            //关联对象的属性是copy并且关联对象使用原子性
    //};
    
    @end
    

    用法:ToolsEntController

    //测试控制器
     ToolsEntController *testVC = [[ToolsEntController alloc] init];
     testVC.controllerId = @"控制器Category的Id";
     [self.navigationController pushViewController:testVC animated:YES];
    

    相关文章

      网友评论

          本文标题:iOS用runtime给Category添加属性

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