美文网首页
OC运行时-关联对象的使用

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

作者: 377f66eb43c9 | 来源:发表于2017-06-17 23:30 被阅读12次

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

    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);
        
    }
    
    

    相关文章

      网友评论

          本文标题:OC运行时-关联对象的使用

          本文链接:https://www.haomeiwen.com/subject/pvgbqxtx.html