美文网首页
iOS Runtime 之关联对象AssociatedObjec

iOS Runtime 之关联对象AssociatedObjec

作者: 不误正业的开发者 | 来源:发表于2020-06-15 14:09 被阅读0次

面试中总该会有人问到关于runtime的问题,虽已不是个纯native开发者,但还是有必要去整理一下以前的笔记,讲述一个古老的故事,故有此文。

一、已有类添加属性

Category在日常开发中是常规操作,关于已有类中添加属性。 @property 可能并不能为我们正常的创建 实例变量SetterGetter 方法。

1.1 使用关联对象

#import <objc/runtime.h>
//  此处为添加属性的getter方法
//  _cmd 指的是:当前方法(即@selector(customPropertyMethod))
- (void)customPropertyMethod {
    NSString *extendVar = objc_getAssociatedObject(self, _cmd);
    if(!extendVar){
        objc_setAssociatedObject(self, _cmd, extendVar, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
}
- (void)setCustomPropertyMethod:(NSArray*) param
{
    objc_setAssociatedObject(self, @selector(customPropertyMethod), param, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

1.2 Description

id objc_getAssociatedObject(id object, const void *key); ,上述使用_cmd 代替的部分,需要一个静态指针,故使用_cmd 来代替,既能保证唯一,也省去声明键值的代码。
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); 关于objc_AssociationPolicy 查阅可知,是不同的属性修饰符号,枚举如下。

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    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. */
};

二、关于实现
runtime 关于reference associate object 主要涉及下述方法


api.png

通过 key-value的形式添加关联对象,在以key的方式获取对象,最后移除关联对象。

相关文章

  • iOS Runtime 之关联对象AssociatedObjec

    面试中总该会有人问到关于runtime的问题,虽已不是个纯native开发者,但还是有必要去整理一下以前的笔记,讲...

  • iOS~runtime之关联对象

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

  • iOS runtime 关联对象

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

  • iOS runtime 关联对象

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

  • iOS runtime之关联对象AssociatedObject

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

  • iOS Runtime特性之关联对象

    前言 现在你准备用一个系统的类或者是你写的类,但是这个类并不能满足你的需求,你需要额外添加一个属性。一般解决办法要...

  • iOS Runtime之四:关联对象

    一、概述 如何给NSArray添加一个属性(不能使用继承)?不能用继承,难道用分类?但是分类只能添加方法不能添加属...

  • Effective Objective-C 2.0 第二章 十、

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

  • runtime 之关联对象

    如何给一个NSArray添加一个属性,不能使用继承。 分类不能添加属性,只能添加方法。这时就可以使用关联对象。 关...

  • Runtime 之关联对象

    关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上。 关联对象的原理: Runtime提供的API:...

网友评论

      本文标题:iOS Runtime 之关联对象AssociatedObjec

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