美文网首页
iOS 给分类添加属性关联对象

iOS 给分类添加属性关联对象

作者: middo | 来源:发表于2019-10-31 16:01 被阅读0次

分类里添加属性,仅仅是生成了set和get方法的声明,并没有实现,需要我们自己写set和get的方法。

几种set,get方法实现案例

1.可以全局字典实现属性的存取

//声明全局的字典

NSMutableDictionary *_names_;

//load方法实现字典

+ (void)load

{

   _ names_ = [NSMutableDictionary dictionary];

}

//实现set方法

-(void)setName:(NSstring *)name

{

   NSString *key = [NSString stringWithFormat:@"%p", self];

    names_[MJKey] = name;

}

//实现get方法

- (NSString *)name

{

//    NSString *key = [NSString stringWithFormat:@"%p", self];

    return names_[MJKey];

}

存在的问题:

全局变量无法释放 

如果每个类在不不同的线程,同时访问set和get,如果不不加锁,可能会出现问题

2.关联对象

- (void)setName:(NSString *)name

{

    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);

}

- (NSString *)name

{

    // 隐式参数

    // _cmd == @selector(name)

    return objc_getAssociatedObject(self, _cmd);

}

第四个参数为关联策略,和变量的对应关系

关联策略,参数4

第二个参数key

参数2可以多样化

第一种方法利用字符串作为key,其中利用@"string",这样写的字符串是放在常量区的,无论哪里用到都是同一内存同一地址,但是这样写容易写错,且编译器没有提醒

更推荐第二种写法,不容易记错其中@selector(name),_cmd_,是函数的隐式参数

实现关联对象技术的核心对象

AssociationsManager

AssociationsHashMap

ObjectAssociationMap

ObjectAssociation

源码解读

其中AssociationsManager类管理了一个全局的散列表,key是添加管理属性的对象,value是ObjectAssociationMap的散列表,其中key是第二个参数,value是ObjectAssociation类,ObjectAssociation其中包含有value和policy,也就是我们传入的第三和第四个参数

全局数据结构

关联对象并不是存储在被关联对象本身的内存中

关联对象存储在全局的同一的AssociationsManager中

设置关联对象为nil,相当于移出关联对象

相关文章

  • iOS Objective-C 关联对象

    iOS Objective-C 关联对象 1. 关联对象简介 对于关联对象,我们熟悉它的地方就是给分类添加属性。虽...

  • 关联对象

    在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散...

  • 关联对象

    在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散...

  • 基础知识

    关联对象 分类中添加属性 NSMutableURLRequest NSURLRequestUsePortocolC...

  • Runtime为分类添加属性-2021-02-24-周三

    正常情况下,分类可以添加方法,但是不能添加属性;通过runtime的关联对象,可以实现分类添加属性的目的; 分类头...

  • runtime的实际应用

    1、使用关联对象动态给分类添加属性 使用关联对象,可以为类添加Category中的属性,我们可以为现有类添加一些实...

  • iOS 给分类添加属性关联对象

    分类里添加属性,仅仅是生成了set和get方法的声明,并没有实现,需要我们自己写set和get的方法。 几种set...

  • Runtime 关联对象, 可在分类中添加属性

    Runtime 关联对象, 可在分类中添加属性 关联 API 如下 设置关联值 获取关联值 取消关联 关联策略

  • iOS 关联对象 Category间接添加成员变量

    iOS添加关联对象即可为分类间接添加成员变量 在分类中声明属性,只相当于声明了两个方法(set和get),不会生成...

  • iOS - 关联对象

    一、简介 关联对象的使用一般用于给 Category 添加成员变量。我们知道,分类添加属性只能生成 setter/...

网友评论

      本文标题:iOS 给分类添加属性关联对象

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