objc_setAssociatedObject 使用

- (void)viewDidLoad {
    [super viewDidLoad];
  
    
//    static const char associatedButtonkey;
    
    
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setTitle:@"点我" forState:UIControlStateNormal];
    [self.view addSubview:btn];
    [btn setFrame:CGRectMake(50505050)];
    btn.backgroundColor = [UIColor redColor];
    
    [btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    
    // Do any additional setup after loading the view, typically from a nib.
    
}
-(void)click:(UIButton *)sender
{
    NSString *message = @"你是谁";
    
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"我要传值·" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];
    alert.delegate = self;
    [alert show];
    
    //#import <objc/runtime.h>头文件
    //objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。
    
    //1 源对象alert
    //2 关键字 唯一静态变量key associatedkey
    //3 关联的对象 sender
    //4 关键策略  OBJC_ASSOCIATION_ASSIGN
//    enum {
//        OBJC_ASSOCIATION_ASSIGN = 0,           若引用/**< Specifies a weak reference to the associated object. */
//        OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object.
//                                                *   The association is not made atomically. */
//        OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied.
//                                                *   The association is not made atomically. */
//        OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
//                                                *   The association is made atomically. */
//        OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.
//                                                *   The association is made atomically. */
//    };
    
    
    objc_setAssociatedObject(alert, @"msgstr", message,OBJC_ASSOCIATION_ASSIGN);
    //把alert和message字符串关联起来,作为alertview的一部分,关键词就是msgstr,之后可以使用objc_getAssociatedObject从alertview中获取到所关联的对象,便可以访问message或者btn了
    
//    即实现了关联传值
    objc_setAssociatedObject(alert, @"btn property",sender,OBJC_ASSOCIATION_ASSIGN);
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    
    
    //通过 objc_getAssociatedObject获取关联对象
    NSString  *messageString =objc_getAssociatedObject(alertView, @"msgstr");
    
    
    UIButton *sender = objc_getAssociatedObject(alertView, @"btn property");
    NSLog(@"%ld",buttonIndex);
    NSLog(@"%@",messageString);
    NSLog(@"%@",[[sender titleLabel] text]);
    
    
    //使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。
}

终端打印:
2015-07-22 16:18:35.294 test[5174:1441210
2015-07-22 16:18:35.295 test[5174:144121] 你是谁
2015-07-22 16:18:35.295 test[5174:144121] 点我


通过objc_setAssociatedObject也可以实现实例之间的数据传输 环境如下:两个viewcontroller,touchbegan点击屏幕,push到第二个viewcontroller在第二个c中获取到第一个c中的字符串,也可以是任何对象

ViewController.m

- ( void)viewDidLoad {
    [ super viewDidLoad];
     self.view.backgroundColor = [ UIColor redColor];
}
void)touchesBegan:( NSSet *)touches withEvent:( UIEvent *)event
- ( {
  NSString *message =  @"这是一条需要传送的消息";
    
    NSLog( @"%p",message);
 
   objc_setAssociatedObject( self.navigationController,  @"test", message, OBJC_ASSOCIATION_ASSIGN);
 
    Test2ViewController *test2  = [[Test2ViewController alloc] init];
     [ self.navigationController pushViewController:test2 animated: YES];
}


Test2ViewController.m

- ( void)viewDidLoad {
    [ super viewDidLoad];
     // Do any additional setup after loading the view.
       NSString  *messageString = objc_getAssociatedObject( self.navigationController,  @"test");
     self.view.backgroundColor = [ UIColor yellowColor];
     NSLog( @"%@",messageString);
     NSLog( @"%@", self.navigationController.viewControllers);
     NSLog( @"%p",messageString);
}

终端打印如下:

连接 :https://my.oschina.net/wupengnash/blog/482377

连接:https://my.oschina.net/wupengnash/blog/482953

猜你喜欢

转载自blog.csdn.net/wenhaiwang/article/details/53085238