iOS用runtime给Category添加属性

2019-04-11  本文已影响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];
上一篇下一篇

猜你喜欢

热点阅读