1. isa 指针
image.png-
instance
的isa
指向class
- 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
-
class
的isa
指向meta-class
- 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
2.class对象的superclass指针
image.png- 当Student的
instance
对象要调用Person的对象方法时,会先通过isa
找到Student的class
,然后通过superclass
找到Person的class
,最后找到对象方法的实现进行调用。
3. meta-class对象的superclass指针
image.png- 当Student的
class
要调用Person的类方法时,会先通过isa
找到Student的meta-class
,然后通过superclass
找到Person的meta-class
,最后找到类方法的实现进行调用
isa、superclass总结
关系图.png1.isa指向
- instance的isa指向class
- class的isa指向meta-class
- meta-class的isa指向基类的meta-class
2.superclass指向
- class的superclass指向父类的class,如果没有父类,superclass指针为nil
- meta-class的superclass指向父类的meta-class
- 基类的meta-class的superclass指向基类的class
3.调用方法的轨迹
-
instance调用对象方法的轨迹
- isa找到class,方法不存在,就通过superclass找父类
-
class调用类方法的轨迹
- isa找meta-class,方法不存在,就通过superclass找父类
例子1
新建一个NSObject的分类
@interface NSObject (Test)
+ (void)test;
@end
@implementation NSObject (Test)
+ (void)test {
NSLog(@"+[NSObject test] - %p", self);
}
@end
然后新建一个CSPerson类
@interface CSPerson : NSObject
+ (void)test;
@end
@implementation CSPerson
+ (void)test {
NSLog(@"+[CSPerson test] - %p", self);
}
开始调用
#import "NSObject+Test.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"[MJPerson class] - %p", [CSPerson class]);
NSLog(@"[NSObject class] - %p", [NSObject class]);
[CSPerson test];
[NSObject test];
}
return 0;
}
打印结果
image.png例子2
将NSObject的分类中类方法改成实例方法
@implementation NSObject (Test)
- (void)test {
NSLog(@"-[NSObject test] - %p", self);
}
@end
去掉CSPerson的test实现方法
@interface CSPerson : NSObject
+ (void)test;
@end
@implementation CSPerson
@end
开始调用
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"[CSPerson class] - %p", [CSPerson class]);
NSLog(@"[NSObject class] - %p", [NSObject class]);
[CSPerson test];
[NSObject test];
}
return 0;
}
输出结果
image.pngimage.png为啥呢?NSObject元类对象的superclass指向基类
isa -> superclass -> superclass -> superclass ...
说明类方法最终都是走基类对象方法
本文参考借鉴MJ的教程视频,非常感谢.
网友评论