标签:des style blog http color io os 使用 ar
头文件:
#import <objc/runtime.h>
Objective-C 开发者习惯于警惕运行时的东西,理由是运行时改变了运行在它上面代码的实际结构。
另一方面,<objc/runtime.h>
的功能就是为应用或框架增加更强大的新特性,是其他的方式无法
实现的。同时它也可能破坏原来代码的逻辑结构,一切与之可能进行的交互,都将有可怕的副作用。
给我们带来极大的惶恐,因此,我们称之为浮士德,也是NSHipster读者经常被所要求的科目之一:
关联的对象。关联的对象或关联的引用,他们原本是Objective-C的2.0运行时的新特性,在OS X
雪豹中介绍(可在iOS 4的)的功能。它在运行时键值允许对象为任意值,这个条目是在
<objc/ runtime.h>声明的,有以下三个C函数:
objc_setAssociatedObject
objc_getAssociatedObject
objc_removeAssociatedObjects
为什么会这样有用吗?它允许开发人员在分类中自定义属性,拓展的类,弥补Objective-C的这个缺陷。
NSObject+AssociatedObject.h @interface NSObject (AssociatedObject) @property (nonatomic, strong) id associatedObject; @end
NSObject+AssociatedObject.m @implementation NSObject (AssociatedObject) @dynamic associatedObject; - (void)setAssociatedObject:(id)object { objc_setAssociatedObject(self, @selector(associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (id)associatedObject { return objc_getAssociatedObject(self, @selector(associatedObject)); }
人们通常的建议是使用静态字符,或者更好的是指针。这基本上保证一个任意的值是固定的、唯一的,
而且仅限于getter和setter方法??中使用:
static char kAssociatedObjectKey; objc_getAssociatedObject(self, &kAssociatedObjectKey);
然而,一个更简单的解决方案存在:只使用一个SEL。
值可以根据由枚举类型objc_AssociationPolicy定义的行为相关联的物体上
Behavior | @property Equivalent | Description |
---|---|---|
OBJC_ASSOCIATION_ASSIGN | @property (assign) or @property (unsafe_unretained) | Specifies a weak reference to the associated object. |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | @property (nonatomic, strong) | Specifies a strong reference to the associated object, and that the association is not made atomically. |
OBJC_ASSOCIATION_COPY_NONATOMIC | @property (nonatomic, copy) | Specifies that the associated object is copied, and that the association is not made atomically. |
OBJC_ASSOCIATION_RETAIN | @property (atomic, strong) | Specifies a strong reference to the associated object, and that the association is made atomically. |
OBJC_ASSOCIATION_COPY | @property (atomic, copy) | Specifies that the associated object is copied, and that the association is made atomically. |
有人可能控制不住地各种诱惑,在他们某些关联的对象时调用objc_removeAssociatedObjects()。
但是,如文档中描述的,你基本没有将有机会亲自调用它: 此函数的主要目的是可以很容易将对象返回
到“原始状态”,你不应该使用这个函数从对象一般移除关联,因为它也消除了其他对象可能已添加到该
对象关联。通常情况下,你应该使用objc_setAssociatedObject 设置nil,以清除关联。
相关联的对象应被看作是不得已的方法,而不是寻找问题的解决方案(说真的,类本身真的不应该在工具链的顶端开始)。 如同任何聪明的把戏,骇客攻击,或解决方法,一般都会积极寻求应用的场合,尤其是了解之后,这是人的一种自然的倾向 。尽你所能地理解和欣赏时,这是正确的解决方案,保存自己被轻蔑地问:“为什么要以神的名义”,然后你决定去解决。
相关代码:
https://github.com/skyming/BlockUI/tree/master/BlockUI
原文连接:
http://nshipster.com/associated-objects/
标签:des style blog http color io os 使用 ar
原文地址:http://blog.csdn.net/skymingst/article/details/39292863