在NSObject.h里面: isa就是指向誰(哪個類)
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
再點開 Class 的定義:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
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;
#endif
}
1芭商,當我們調(diào)用[child class] 的時候屡拨,child就會通過isa指針去找到Child的class口蝠。
2乡洼,當我們調(diào)用[child superclass]的時候嫌术,child 通過isa找到Child的class献烦,再通過super_class彤敛,找到Parent的class与帆。
在這里,再普及objc_class 的兩種類型:
class:實例對象(child墨榄、Child)的isa指向的結(jié)構(gòu)體玄糟;
metaclass:class的isa指向的一個結(jié)構(gòu)體;
3袄秩,接著阵翎,調(diào)用[child SelectorC],child通過isa找到Child的class之剧,在class(注意看上面 struct objc_class 的定義)的方法列表里面找到SelectorC郭卫;
4,再試著調(diào)用[child SelectorP]背稼,child通過isa找到Child的class贰军,發(fā)現(xiàn)class里面并沒有這個方法,通過class里面的super_class找到Parent的class蟹肘,在里面的方法列表找到了SelectorP词疼;
5,再是類方法[Child ClassSelectorC]帘腹,Child(請注意贰盗,大寫)通過isa找到Child的class,通過class的isa找到Child的metaclass阳欲,在metaclass的方法列表里面找到了ClassSelectorC舵盈;
6,再試著調(diào)用[Child ClassSelectorP]胸完,Child通過isa找到Child的class书释,通過class的isa找到Child的metaclass,發(fā)現(xiàn)metaclass里面并沒有這個方法赊窥,通過metaclass里面的super_class找到Parent的metaclass爆惧,在里面的方法列表找到了ClassSelectorP;
<h1>按鈕觸發(fā)其他類里面的類方法
<h5>objc_getMetaClass//元類
objc_getClass//類
class_getSuperclass//父類,三個方法參數(shù)為''char''返回值Class,忘記的話查看class的文件.
unsigned int count;
Method * methods = class_copyMethodList(objc_getMetaClass("mangeiChild"), &count);
for (int i=0; i<count; i++) {
Method method = methods[i];
selector = method_getName(method);
}
[self.btn addTarget:[mangeiChild class] action:selector forControlEvents:UIControlEventTouchUpInside];