1.category
方法的調(diào)用順序:category>本類>父類
為什么category不能直接添加屬性:
struct?objc_class?{
????Class?isa??OBJC_ISA_AVAILABILITY;
#if?!__OBJC2__
????Class?super_class???????????????????????OBJC2_UNAVAILABLE;??//?父類
????const?char?*name????????????????????????OBJC2_UNAVAILABLE;??//?類名
????long?version????????????????????????????OBJC2_UNAVAILABLE;??//?類的版本信息匾效,默認為0
????long?info???????????????????????????????OBJC2_UNAVAILABLE;??//?類信息,供運行期使用的一些位標識
????long?instance_size??????????????????????OBJC2_UNAVAILABLE;??//?該類的實例變量大小
????struct?objc_ivar_list?*ivars????????????OBJC2_UNAVAILABLE;??//?該類的成員變量鏈表
????struct?objc_method_list?**methodLists???OBJC2_UNAVAILABLE;??//?方法定義的鏈表
????struct?objc_cache?*cache????????????????OBJC2_UNAVAILABLE;??//?方法緩存
????struct?objc_protocol_list?*protocols????OBJC2_UNAVAILABLE;??//?協(xié)議鏈表
#endif
}?OBJC2_UNAVAILABLE;
這是類的結(jié)構(gòu)體
ivars指向的是一個固定區(qū)域,只能修改成員變量值,不能增加成員變量個數(shù);methodList是一個二維數(shù)組,所以可以修改*methodLists的值來增加成員方法歧蕉;
category中能添加屬性嗎:
Category實際上允許添加屬性的,同樣可以使用@property康铭,但是不會生成_變量(帶下劃線的成員變量)惯退,也不會生成添加屬性的getter和setter方法的實現(xiàn)
生成方法?
需要注意的有兩點:
1)从藤、category的方法沒有“完全替換掉”原來類已經(jīng)有的方法催跪,也就是說如果category和原來類都有methodA,那么category附加完成之后夷野,類的方法列表里會有兩個methodA懊蒸。
2)、category的方法被放到了新方法列表的前面悯搔,而原來類的方法被放到了新方法列表的后面榛鼎,這也就是我們平常所說的category的方法會“覆蓋”掉原來類的同名方法,這是因為運行時在查找方法的時候是順著方法列表的順序查找的,它只要一找到對應(yīng)名字的方法者娱,就會罷休抡笼,殊不知后面可能還有一樣名字的方法。
category添加屬性:
static NSString *nameSetterGetterKey =@"nameWithSetterGetterKey";
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
? ? ? ? objc_setAssociatedObject(self, &nameSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}
- (NSString *)nameWithSetterGetter {
? ? returnobjc_getAssociatedObject(self, &nameSetterGetterKey);
}
2.extension:
上圖是extension的使用黄鳍,并沒有多大用處推姻,只是可用用來聲明一個外部無法訪問的全局屬性