現(xiàn)在你準備用一個系統(tǒng)的類炸枣,但是系統(tǒng)的類并不能滿足你的需求,你需要額外添加一個屬性弄唧。
這種情況的一般解決辦法就是繼承适肠。
但是,只增加一個屬性候引,就去繼承一個類侯养,總是覺得太麻煩類。
這個時候澄干,runtime的關聯(lián)屬性就發(fā)揮它的作用了逛揩。
其實,你還可以把添加和獲取關聯(lián)對象的方法寫在你需要用到這個功能的類的類別中麸俘,方便使用辩稽。
- (NSObject *)property {
return objc_getAssociatedObject(self, @selector(property));
}
- (void)setProperty:(NSObject *)value {
objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
解釋一下上面的代碼,property就是你要添加的屬性从媚。那么重寫他的get方法逞泄,也就是說現(xiàn)在property獲取到的事通過 objc_getAssociatedObject 獲取到的東西。
然后objc_getAssociatedObject 獲取到的東西就是 objc_setAssociatedObject 設置的東西拜效。
objc_setAssociatedObject的意思就是 給當前這個類(self)添加一個 叫value的 關聯(lián)屬性喷众,而且屬性的唯一Id叫 @selector(property)。關聯(lián)策略是 retain_nonatomic....
- id object給誰設置關聯(lián)對象紧憾。
- const void *key關聯(lián)對象唯一的key到千,獲取時會用到的主鍵。
- id value關聯(lián)對象稻励。
- objc_AssociationPolicy關聯(lián)策略父阻,有以下幾種策略:
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};