第四章 Runtime应用:关联对象(添加属性) 青旅半醒 2022-05-21 12:10 125阅读 0赞 关联对象(Objective-C Associated Objects)给分类增加属性。 关联对象 void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) 获取关联的对象 id objc_getAssociatedObject(id object, const void *key) 移除关联的对象 void objc_removeAssociatedObjects(id object) > 1、id object:被关联的对象 > 2、const void \*key:关联的key,要求唯一 > 3、id value:关联的对象 > 4、objc\_AssociationPolicy policy:内存管理的策略 > (1)OBJC\_ASSOCIATION\_ASSIGN @property (assign) 或 @property (unsafe\_unretained) 指定一个关联对象的弱引用。 > (2)OBJC\_ASSOCIATION\_RETAIN\_NONATOMIC @property (nonatomic, strong) @property (nonatomic, strong) 指定一个关联对象的强引用,不能被原子化使用。 > (3)OBJC\_ASSOCIATION\_COPY\_NONATOMIC @property (nonatomic, copy) 指定一个关联对象的copy引用,不能被原子化使用。 > (4)OBJC\_ASSOCIATION\_RETAIN @property (atomic, strong) 指定一个关联对象的强引用,能被原子化使用。 > (5)OBJC\_ASSOCIATION\_COPY @property (atomic, copy) 指定一个关联对象的copy引用,能被原子化使用。 代码示例 接口文件.h #import <UIKit/UIKit.h> @interface UIView (RunTime) // 关联对象(添加属性) @property (nonatomic, strong) UIColor *defaultColor; @end 实现文件.m #import "UIView+RunTime.h" #import <objc/runtime.h> @implementation UIView (RunTime) #pragma mark - 关联对象(添加属性) - (void)setDefaultColor:(UIColor *)defaultColor { objc_setAssociatedObject(self, @selector(defaultManager), defaultColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (defaultColor) { self.backgroundColor = defaultColor; } } - (UIColor *)defaultColor { return objc_getAssociatedObject(self, @selector(defaultColor)); } @end 使用 #import "ViewController.h" // 导入头文件 #import "UIView+RunTime.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.title = @"runtime"; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"click" style:UIBarButtonItemStyleDone target:self action:@selector(buttonClick)]; // 关联对象(添加属性) UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10.0, 10.0, 60.0, 60.0)]; [self.view addSubview:view]; view.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.2]; view.defaultColor = [UIColor greenColor]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 效果图 ![关联对象][70] [70]: /images/20220521/4902ffc953cd4d749109fa09ca4a1aec.png
还没有评论,来说两句吧...