【Effective Objective-C 2.0 读书笔记】第十条:在既有类中使用关联对象存放自定义数据

第十条:在既有类中使用关联对象存放自定义数据

有时需要在对象中存放相关信息。

这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。

并非所有的情况下都能这么做,有时候类的实例可能是由某种机制所创建的。

而开发者无法令这种机制创建出自己所写的子类实例。

Objective-C中有一项强大的特性可以解决此问题,这就是“关联对象”(Associated Object)。

可以给某对象关联许多其他对象,这些对象通过“键”来区分。

存储对象值的适合,可以指明“存储策略”(Strong policy),用以维护相应的“内存管理语义”。

存储策略由名为objc_AssociationPolicy的枚举所定义。

等效的@property属性:假如关联对象成为了属性,那么它就会具备对应的语义。

【对象关联类型】                                               【等效的@property属性】

OBJC_ASSOCIATION_ASSIGN                            assign

OBJC_ASSOCIATION_RETAIN_NONATOMIC      nonatomic,retain

OBJC_ASSOCIATION_COPY_NONATOMIC        nonatomic,copy

OBJC_ASSOCIATION_RETAIN                             retain

OBJC_ASSOCIATION_COPY                               copy

下列方法可以管理关联对象:

此方法以给定的键和策略为某对象设置关联对象值

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

此方法根据给定的键从某对象中获取相应的关联对象值

id objc_getAssociatedObject (id object, void *key)

此方法移除指定对象的所有关联对象值

void objc_removeAssociatedObjects (id object)

这种方法很有用,但是只应该在没有其他的办法达成你想做的事情的时候用到它。

若是滥用,则很快就会令代码失控,使其难于调试。

使用了“块”(block)可能会捕获(capture)某些变量,这也许会造成“循环引用”(reatain cycle)。

使用这种方法(approach)时要特别小心,不能仅仅因为某处可以用该方法就一定要用它。

【要点】

1.可以通过“关联对象”机制来把两个对象连起来

2.定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系”

3.只有在其他做法不可行时,才应选用关联对象,因为这种做法通常会引入难于查找的bug

【Things to Remember】

1.Associated objects provide a means of linking two objects toghter

2.The memory-management semantics of associated objects can be defined to mimic owning or nonowning relationships.

3.Associated objects should be used only when another approach is not possible,since they can easily introduce hard-to-find bugs.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容