iOS runtime 关联对象

作者: LoveY34 | 来源:发表于2016-12-05 17:31 被阅读318次

最近在看runtime的相关知识,感觉里面东西还蛮多的,反正感觉runtime被戴上了很多高大上的帽子。查看了很多文章,下面两个头文件是被提及的最多的,上面一个头文件主要提及到OC中的类、方法、属性和成员变量,详细的说明了他们的本质,而下面的头文件说明了OC中方法调用的本质,同时这些头文件中涉及到很多C语言中的概念,主要是结构体,结构体指针等,看着有点晕乎。

#import <objc/runtime.h>
#import <objc/message.h>

但是我写这篇文章的主要意图是为了给runtime的关联对象做一个总结,当然现在也只是初步了解,后期有新的看法就会更新这篇文章的。

1.关联对象的概念

关联对象说的简单点就是利用键值对的方式把两个对象关联起来,而关联的唯一标示就是key值

2.关联对象常用的方法
    /**
     *  @author liyong
     *
     *  为object添加关联对象value
     *
     *  @param object 关联对象中的被关联的对象
     *  @param key    关联的key值(这个key值必须保证是一个对象级别的唯一常量😂这地方有待研究,一个key值不知道为啥这么复杂)
     *  @param value  关联的对象
     *  @param policy 关联的内存管理策略
     *
     *  @return
     */
    objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
  • 关联的key值有三种推荐值
    1.声明 static char kAssociatedObjectKey; ,使用 &kAssociatedObjectKey 作为 key 值
    2.声明 static void *kAssociatedObjectKey = &kAssociatedObjectKey; ,使用 kAssociatedObjectKey 作为 key 值
    3.用 selector ,使用 getter 方法的名称作为 key 值(这种方法用的比较多)

  • policy是关联的对象的内存管理策略,是一个枚举类型,值有如下五种,使用方法跟属性的描述一样

OBJC_ASSOCIATION_ASSIGN             // 对关联对象进行弱引用
OBJC_ASSOCIATION_RETAIN_NONATOMIC   // 对关联对象进行强引用(非原子)
OBJC_ASSOCIATION_COPY_NONATOMIC     // 对关联对象进行拷贝引用(非原子)
OBJC_ASSOCIATION_RETAIN             // 对关联对象进行强引用
OBJC_ASSOCIATION_COPY               // 对关联对象进行拷贝引用
    /**
     *  @author liyong
     *
     *  根据被关联的对象和关联的key值获取关联的对象
     *
     *  @param object 关联对象中的被关联的对象
     *  @param key    关联的key值
     *
     *  @return 关联的对象
     */
    objc_getAssociatedObject(id object, const void *key)
    /**
     *  @author liyong
     *
     *  移除被关联对象的所有关联对象
     *  但是这个方法用的不多,把objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
     *  中的value设为nil就会根据key清空object关联的对象
     */
    objc_removeAssociatedObjects(id object)

大家要是觉得注释的不是很好的话,<objc/runtime.h>中有详细的英文注释。

3.关联对象的用法

关联对象用的最多的就是为已有的类添加属性(关于属性和实例变量的区别可以查看属性与实例变量),至于别的用法我暂时还没遇到😂😂(我感觉runtime在开发中用的本来就少,但是对runtime的学习有助于对OC和iOS开发的深入了解)。
话不多说,直接上代码

@interface LYPersonModel (testCategory)

@property (copy, nonatomic) NSString *englishName;

@end
@implementation LYPersonModel (testCategory)

- (void)setEnglishName:(NSString *)englishName
{
    objc_setAssociatedObject(self, @selector(englishName), englishName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)englishName
{
    return objc_getAssociatedObject(self, @selector(englishName));
}

@end

代码不多,就两句,利用class_copyPropertyList()获取对象的成员变量就会发现类别中的属性也会出现列表中(但是利用class_copyIvarList()获取成员变量列表的时候发现没有待下划线的成员变量,看来关联对象只是变相的为类扩展了属性,实际上并没有扩张成员变量)。

相关文章

  • iOS runtime 关联对象

    最近在看runtime的相关知识,感觉里面东西还蛮多的,反正感觉runtime被戴上了很多高大上的帽子。查看了很多...

  • iOS runtime 关联对象

    关联对象 Associated Object 顾名思义,就是把一个对象关联到另外一个对象身上。 关于关联对象,ru...

  • Effective Objective-C 2.0 第二章 十、

    我之前已经在这篇文章iOS runtime 关联对象做了详细介绍。本篇只是简单介绍下。 创建关联对象: id ob...

  • iOS runtime应用:关联对象

    问题:“如何给OC对象(如 NSArray、UIViewController等)添加一个属性,且不使用继承的情况下...

  • iOS~runtime之关联对象

    什么是runtime? RunTime又叫运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...

  • 【iOS开发】Runtime关联对象

    众所周知,Category 是不能添加成员变量的,倒是可以添加属性,不过不会自动生成 getter 和 sette...

  • iOS关联对象技术原理

    iOS关联对象技术原理 iOS关联对象技术原理

  • ios运行时一些方法说明

    一. 关联对象主要函数: 基本说明:关联对象就是runTime界的NSMultableDictionary voi...

  • Runtime - 关联对象

    马上就要开始新的项目,这个礼拜抽空来写一篇博客。于是就写一个比较贴近大家工作开发的runtime其中一个用法吧。一...

  • iOS runtime之关联对象AssociatedObject

    在分类中添加属性,使用对象关联来实现: 例子:创建一个label的分类 #import@interfaceUILa...

网友评论

    本文标题:iOS runtime 关联对象

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