美文网首页
iOS-关联对象技术

iOS-关联对象技术

作者: 御雪飞斐 | 来源:发表于2019-03-25 16:10 被阅读0次

为某个对象设置关联对象的值:

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)

// 第一个参数是主对象,第二个参数是键,第三个参数是关联的对象,第四个参数是存储策略:是枚举,定义了内存管理语义。

根据给定的键从某对象中获取相应的关联对象值:

id objc_getAssociatedObject(id object, void *key)

移除指定对象的关联对象:

void objc_removeAssociatedObjects(id object)
#import <objc/runtime.h>

static void *EOCMyAlertViewKey = "EOCMyAlertViewKey";


- (void)askUserAQuestion {

         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Question"
                                                         message:@"What do you want to do?"
                                                        delegate:self
                                               cancelButtonTitle:@"Cancel"
                                               otherButtonTitles:@"Continue", nil];

         void (^block)(NSInteger) = ^(NSInteger buttonIndex){

                     if (buttonIndex == 0) {
                            [self doCancel];
                     } else {
                            [self doContinue];
                    }
         };

         //将alert和block关联在了一起
         objc_setAssociatedObject(alert,EOCMyAlertViewKey,block, OBJC_ASSOCIATION_COPY);
         [alert show];
}

// UIAlertViewDelegate protocol method
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
     //alert取出关联的block
      void (^block)(NSInteger) = objc_getAssociatedObject(alertView, EOCMyAlertViewKey)
     //给block传入index值
      block(buttonIndex);
}

注:id value 必须为对象!!!

- (void)setWlt_disableGoBackInteractive:(BOOL)wlt_disableGoBackInteractive {
    objc_setAssociatedObject(self, @selector(wlt_disableGoBackInteractive), @(wlt_disableGoBackInteractive), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)wlt_disableGoBackInteractive {
    return [objc_getAssociatedObject(self, _cmd) boolValue];
}

注:key可以用_cmd,相当于"wlt_navDelegate"-入参的字符串

- (void)setWlt_navDelegate:(WLNavigationControllerDelegate *)wlt_navDelegate {
    objc_setAssociatedObject(self, @selector(wlt_navDelegate), wlt_navDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (WLNavigationControllerDelegate *)wlt_navDelegate {
    return objc_getAssociatedObject(self, _cmd);
}

相关文章

网友评论

      本文标题:iOS-关联对象技术

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