美文网首页
iOS中关联对象的简单使用objc_setAssociatedO

iOS中关联对象的简单使用objc_setAssociatedO

作者: 福将的逆袭 | 来源:发表于2018-04-13 10:49 被阅读0次

    iOS中关联对象的简单使用objc_setAssociatedObject

    首先看一下此方法接收的参数

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

    被关联的对象,下面举的例子中关联到了UIAlertView

    要关联的对象的键值,一般设置成静态的,用于获取关联对象的值

    要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象

    关联时采用的协议,有assign,retain,copy等协议,具体可以参考官方文档

    具体用法一:

    - (void)viewDidLoad {    

    [superviewDidLoad];

    NSString*firsrString =@"我是第一个按钮";

    // �传入的对象可以是字符串,字典,数组类型

    NSString*secondString =@"我是第二个按钮";

    UIButton*btn = [[UIButtonalloc] initWithFrame:CGRectMake(100,100,150,50)];   

     [btn setBackgroundColor:[UIColorredColor]];    

    [btn setTitle:@"按钮传值"forState:UIControlStateNormal];  

      [self.view addSubview:btn];      

      objc_setAssociatedObject(btn,"firstObject", firsrString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    objc_setAssociatedObject(btn,"secondObject", secondString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);   

     [btn addTarget:selfaction:@selector(click:) forControlEvents:UIControlEventTouchUpInside];}

    - (void)click:(UIButton*)sender{

    idfirst = objc_getAssociatedObject(sender,"firstObject");

    idsecond = objc_getAssociatedObject(sender,"secondObject");

    NSLog(@"%@--%@", first, second);

    }

    解释一下:

    第一步: 设定关联objc_setAssociatedObject(btn, "firstObject", someObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);第一个参数:btn为被关联者(主体),第二个参数:firstObject为指向关联的对象的指针(一般为一个static字符串),第三个参数:关联的对象实例,第四个对象:关联的方式(有几种,类似设定.h文件属性时候的 assign,retain等)

    第二步:得到关联的对象

    id first = objc_getAssociatedObject(btn, "firstObject");第一个参数:为被关联者第二个参数:为关联对象的指针。

    具体用法二:

    tableview 点击 cell上的编辑按钮传值:

    - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {   

     StudioTemplateCell *cell = [tableView dequeueReusableCellWithIdentifier:@"StudioTemplateCellID"]; 

       [cell.editButton addTarget:selfaction:@selector(editClick:) forControlEvents:UIControlEventTouchUpInside];    objc_setAssociatedObject(cell.editButton,@"indexPathKey", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    returncell;}

    - (void)editClick:(UIButton*)btn{NSIndexPath*index = objc_getAssociatedObject(btn,@"indexPathKey");NSLog(@"%@", index);}

    相关文章

      网友评论

          本文标题:iOS中关联对象的简单使用objc_setAssociatedO

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