关联对象存放自定义数据

2016-09-21  本文已影响21人  蔡俊宇

关联对象存放自定义数据

关于objc_setAssociatedObject和objc_getAssociatedObject

最近是在52个提高IOS高质量代码中看到这个特性的.
在我写代码的过程中,我感觉这种方式可以提供代理中的高聚合(和RAC的函数式编程有异曲同工之妙)
先把代码上上来:
- (void)viewDidLoad {
[super viewDidLoad];

            UIAlertView* alert =  [[UIAlertView alloc] initWithTitle:@"信息" message:@"提示" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];

            void (^block)(NSInteger) = ^(NSInteger buttonIndex){
                if (buttonIndex == 0) {
                    NSLog(@"取消按钮");
                }else if (buttonIndex == 1){
                    NSLog(@"确认按钮");
                }
                
            };

            objc_setAssociatedObject(alert, ALERTVIEWKEY, block,             OBJC_ASSOCIATION_COPY);
        //
        //    NSString* str = @"存储自定义数据";
        //    
        //    objc_setAssociatedObject(alert, ALERTVIEWKEY, str,             OBJC_ASSOCIATION_COPY);
            [alert show];

        }

在实现代理中,代码如下:

 #pragma alertDelegate
  -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:   (NSInteger)buttonIndex{

void(^block)(NSInteger) = objc_getAssociatedObject(alertView, ALERTVIEWKEY);
block(buttonIndex);
  //    NSString* str = objc_getAssociatedObject(alertView, ALERTVIEWKEY);
  //    NSLog(@"%@",str);

NSLog(@"%ld",(long)buttonIndex);
  }

我们所得到的效果是可以在上面viewDidload代码中直接执行了按钮的响应.
点击不同的按钮作出相应的动作.

实际上,在set方法中:

objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

方法中,我们可以在id value传入任意参数,字符串(如注释代码中str的传递),数组,字典等,当然,例子中传递匿名函数就是较为灵活的用法.

而代理中调用runtime的get方法:

objc_getAssociatedObject(<#id object#>, <#const void *key#>

注意

其实这种方法并不推荐大家经常使用,因为滥用的话容易导致代码失控,难于调试.

上一篇下一篇

猜你喜欢

热点阅读