如何給對象增加實例變量?我們都知道用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就不用繼承,因爲隨着繼承深度的增加,代碼的可維護性也會增加很多。下面是源碼:
第一步:新建一個分類 如下圖
第二步:添加文件名
生成一個類
.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