如何給對象增加執行個體變量?我們都知道用category可以給已經存在的類增加方法,但是無法給已經存在的類增加執行個體變量。系統提供了associative references,這個問題就很容易解決了。這個方法就是所謂的關聯(association),我們可以在runtime期間動态給對象添加任意多的屬性,并且能任意讀取。這裡用的了兩個重要的API:
-
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key,
id value, objc_AssociationPolicy policy)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
2.
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
我們用一個執行個體來說明一下:給UILabel用category增加一個屬性,一個FlashColor。我們有一個原則:能用category就不用繼承,因為随着繼承深度的增加,代碼的可維護性也會增加很多。下面是源碼:
第一步:建立一個分類 如下圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISMwMDNwQzMxETNwcDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
第二步:添加檔案名
生成一個類
.h檔案
import
import “objc/runtime.h”
@interface UILabel (flashClolr)
@property(nonatomic, retain) NSString *FlashColor;
- (NSString *) getFlashColor;
@end
.m檔案
import “UILabel+flashClolr.h”
@implementation UILabel (flashClolr)
@dynamic FlashColor;
static char flashColorKey;
-
(void)setFlashColor:(NSString *)flashColor
{
objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-
(NSString *) getFlashColor{
return objc_getAssociatedObject(self, &flashColorKey);
}
@end