iOS用runtime给Category添加属性

用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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。