為什么需要關聯(lián)對象
有時需要在對象中存放相關信息惊科。通常的做法:從這個對象的類中繼承一個子類康栈,來存放我們的信息。但是算灸,有時候?qū)ο蟛皇侵苯油ㄟ^類來創(chuàng)建的,這種時候我們就沒法來通過繼承一個子類保存我們需要的信息驻啤。
所以菲驴,為了解決這個問題。就有了 『關聯(lián)對象』
關聯(lián)對象的策略
關聯(lián)類型 | 等效的@property 屬性 |
---|---|
OBJC_ASSOCIATION_ASSIGN | assign |
OBJC_ASSOCIATION_RETAIN_NONATIONMIC | nonationmic,retain |
OBJC_ASSOCIATION_COPY_NONATIONMIC | nonationmic,copy |
OBJC_ASSOCIATION_RETAIN | retain |
OBJC_ASSOCIATION_COPY | copy |
管理關聯(lián)對象的方法
-
void objc_setAssociatedObject(id object,void *key,id value ,objc_AssociationPolicy policy)
給定鍵和策略給某個對象設置關聯(lián)對象 -
id objc_getAssociatedOjbect(id object,void *key)
根據(jù)鍵從某個對象中取出對應的關聯(lián)對象 -
void objc_removeAssociatedObjects(id object)
移除某個對象的所有關聯(lián)對象
理解關聯(lián)對象
我們可以把某對象想象成 NSDictonary .關聯(lián)到該對象的值理解為字典中的條目
存取對象的值就相當于字典對象上調(diào)用
[object setObject:value forKey:key]
與[object objectForKey:key]
兩者之間有個重要的差別: 設置關聯(lián)對象是用的鍵(key) 是個不透明的指針(其所指向的數(shù)據(jù)結(jié)構不局限于某種特定類型的指針)
在設置關聯(lián)對象時骑冗,若想令兩個鍵匹配到同一個值赊瞬,則兩者必須是相同的指針才行先煎。所以在設置關聯(lián)對象值是,通常使用靜態(tài)全局變量做鍵(static void *EOCMyAlertViewKey = "EOCMyAlertViewKey";)
注意
- 只有在其他做法不可行時才應選用關聯(lián)對象巧涧,因為這種做法通常會引入難以查找的 BUG