OC运行时-关联对象的使用

2017-06-17  本文已影响12人  377f66eb43c9

使用关联对象来存放自定义属性。

  1. 含义解释:就是在运行时动态的给某个对象添加属性,这种做法,需要在其他方法不可行的情况下考虑,因为这种做法会容易引入难以查找的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);
    
}

上一篇下一篇

猜你喜欢

热点阅读