在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,当我们调用[child class] 的时候,child就会通过isa指针去找到Child的class。
2,当我们调用[child superclass]的时候,child 通过isa找到Child的class,再通过super_class,找到Parent的class。
在这里,再普及objc_class 的两种类型:
class:实例对象(child、Child)的isa指向的结构体;
metaclass:class的isa指向的一个结构体;
3,接着,调用[child SelectorC],child通过isa找到Child的class,在class(注意看上面 struct objc_class 的定义)的方法列表里面找到SelectorC;
4,再试着调用[child SelectorP],child通过isa找到Child的class,发现class里面并没有这个方法,通过class里面的super_class找到Parent的class,在里面的方法列表找到了SelectorP;
5,再是类方法[Child ClassSelectorC],Child(请注意,大写)通过isa找到Child的class,通过class的isa找到Child的metaclass,在metaclass的方法列表里面找到了ClassSelectorC;
6,再试着调用[Child ClassSelectorP],Child通过isa找到Child的class,通过class的isa找到Child的metaclass,发现metaclass里面并没有这个方法,通过metaclass里面的super_class找到Parent的metaclass,在里面的方法列表找到了ClassSelectorP;
<h1>按钮触发其他类里面的类方法
<h5>objc_getMetaClass//元类
objc_getClass//类
class_getSuperclass//父类,三个方法参数为''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];
网友评论