-
動(dòng)態(tài)添加屬性
/*
產(chǎn)生關(guān)聯(lián),讓某個(gè)對(duì)象(name)與當(dāng)前對(duì)象的屬性(name)產(chǎn)生關(guān)聯(lián)
參數(shù)1: id object :表示給哪個(gè)對(duì)象添加關(guān)聯(lián)
參數(shù)2: const void *key : 表示: id類(lèi)型的key值(以后用這個(gè)key來(lái)獲取屬性) 屬性名
參數(shù)3: id value : 屬性值
參數(shù)4: 策略, 是個(gè)枚舉(點(diǎn)進(jìn)去,解釋很詳細(xì))
*/objc_setAssociatedObject(self, "Alex", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
動(dòng)態(tài)添加方法
- (BOOL)resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(resolveThisMethodDynamically)) {
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:aSEL];
}
// 參數(shù)解釋:
// Class;給哪個(gè)類(lèi)添加方法
// SEL:添加方法
// IMP:方法實(shí)現(xiàn),函數(shù)名
// types:方法類(lèi)型(不要去死記,官方文檔中有)
class_addMethod(__unsafe_unretained Class cls, SEL name, IMP imp, const char *types)
Method swizzling指的是改變一個(gè)已存在的選擇器對(duì)應(yīng)的實(shí)現(xiàn)的過(guò)程,它依賴(lài)于Objectvie-C中方法的調(diào)用能夠在運(yùn)行時(shí)進(jìn)改變——通過(guò)改變類(lèi)的調(diào)度表(dispatch table)中選擇器到最終函數(shù)間的映射關(guān)系。
method swizzling可以通過(guò)選擇器來(lái)改變它引用的函數(shù)指針。