当前位置: 首页 > 工具软件 > Objectivist-C > 使用案例 >

Object-c Associated Object

锺英卫
2023-12-01

  oc的关联的作用在我看来就是将两个对象关联起来,用的时候通过key和对象把和这个对象关联的对象再取出来(我做的项目就是和UITableView里面的一个属性关联起来了)

举个栗子:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 100, 100, 100);
    [button setTitle:@"关联测试" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonTap) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (void)buttonTap{
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@""
                                                     message:@"How (are) you doing" delegate:self cancelButtonTitle:@"Not bad" otherButtonTitles:@"Fine", nil];
    void (^block)(NSInteger) = ^(NSInteger buttonIndex){
        if (buttonIndex == 0) {
            NSLog(@"buttonIndex:0");
        }else{
            NSLog(@"buttonIndex:1");
        }
    };
    objc_setAssociatedObject(alert, key, block, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [alert show];
    
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    void (^block)(NSInteger) = objc_getAssociatedObject(alertView, key);
    block(buttonIndex);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}

@end

上面的栗子就是把alert和block关联起来,你关联的什么对象类型,取得就是什么对象类型,然后利用取出来的对象做你想做的事,上面的栗子就是取出block,完了在block里面做你想做的事,并且block在alert后面,使你看代码更容易一些,(在我看来,然并卵),这个栗子也算是我从《Effective Object-c》借鉴来的,真心觉得这个自己不太好,但是对于理解对象关联够用了,OBJC_ASSOCIATION_RETAIN_NONATOMIC这个和(nonatomic,retain)是一样的作用,如下表

OBJC_ASSOCIATION_ASSIGN@property (assign) or @property (unsafe_unretained)Specifies a weak reference to the associated object.
OBJC_ASSOCIATION_RETAIN_NONATOMIC@property (nonatomic, strong)Specifies a strong reference to the associated object, and that the association is not made atomically.
OBJC_ASSOCIATION_COPY_NONATOMIC@property (nonatomic, copy)Specifies that the associated object is copied, and that the association is not made atomically.
OBJC_ASSOCIATION_RETAIN@property (atomic, strong)Specifies a strong reference to the associated object, and that the association is made atomically.
OBJC_ASSOCIATION_COPY@property (atomic, copy)Specifies that the associated object is copied, and that the association is made atomically.
而且,用block还要注意循环引用的问题,这个在这里就不多说了,我个人认为http://kingscocoa.com/tutorials/associated-objects/这个写的不错,是全英文的,不过不难,建议可以看看,理解问题会更上一层楼,这个博客讲解了为什么用关联,举得栗子就是正常写的情况下,记录你要删除的cell的IndexPath,会把这个IndexPath弄成全局变量来记录,完了操作删除,但是要想到一个问题就是我要是在其他地方也操作这个值不就会乱套么,或者我就用一次,用全局变量就太麻烦了,所以索性用关联记录这个值,于是可以模仿我上面的栗子写,不过博主用了三种方法阐述,第一个就是想我上面栗子一样正常写,第二种就是给NSObject加拓展方法,传入对象和关联的值,第三种就是给UIALertView加类方法,把IndexPath设置成属性,重写setter和getter方法,我觉得博主的想法很巧妙,希望借鉴,谢谢




参考链接:http://nshipster.com/associated-objects/

                 http://kingscocoa.com/tutorials/associated-objects/

 类似资料: