OC运行时-关联对象的使用
2017-06-17 本文已影响12人
377f66eb43c9
使用关联对象来存放自定义属性。
-
含义解释:就是在运行时动态的给某个对象添加属性,这种做法,需要在其他方法不可行的情况下考虑,因为这种做法会容易引入难以查找的bug!
关联类型 | 等效的属性 |
---|---|
OBJC_ASSOCIATION_ASSIGN | assign |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | nonatomic, retain |
OBJC_ASSOCIATION_COPY_NONATOMIC | nonatomic, copy |
OBJC_ASSOCIATION_RETAIN | retain |
OBJC_ASSOCIATION_COPY | copy |
关键方法
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)//
移除关联值
使用案例
需求:一个控制器上,需要添加多个alertView,在创建视图时就想把每个按钮的逻辑都写好。
-(void)answerUser{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"要退出吗?" message:nil delegate:self cancelButtonTitle:@"不" otherButtonTitles:@"是的", nil];
alert.delegate = self;
self.alertView = alert;
void(^block)(NSInteger) = ^(NSInteger buttonIndex){
if(buttonIndex == 0){
[self doCancel];
}else{
[self doQuit];
}
};
objc_setAssociatedObject(alert, alertViewKey, block, OBJC_ASSOCIATION_COPY);
[alert show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
void(^block)(NSInteger) = objc_getAssociatedObject(self.alertView, alertViewKey);
block(buttonIndex);
}