isa
各种对象的组成.png- 对象的isa指针是指向哪里的?
- instance的 isa 指向 class
- 当调用对象方法时,通过instance的isa找到class ,最后找到对象方法的实现进行调用
- class的isa 指向 meta-class
- 当调用类方法时,通过class的isa 找到meta-class 最后找到类方法发实现进行调用
superClass
- 先从对象的isa 找到 对象的class 然后通过 superClass指针指向父类的class然后 找到父类方法执行
meta-class 对象的superClass指针
image.png调用父类的类方法 是上图流程
总结
runtime关系图.png
- instance 的 isa 指向class
- class的 isa 指向 meta-class
- meta-class的 isa 指向
基类的 meta-class
- class的superclass指向父类的class
- 如果没有父类,superclass指针为
nil
- meta-class 的superclass指向父类的meta-class
基类的meta-class的superclass指向基类的class
instance调用对象方法的轨迹
isa找到Class ,方法存在 就通过superClass找父类
class 调用类方法的轨迹
isa找到meta-class,方法不存在,就是通过superClass找父类
值得注意的是基类的meta-class的superclass指针指向基类的class对象
swift 用类方法的方式调用父类的对象方法不能调用成功
extension NSObject {
func textforlog6(){
print("NSObject - 对象方法")
}
}
class textVCRoot :NSObject {
func textforlog(){
print("textVCRoot - 对象方法")
}
class func textforlog2(){
print("textVCRoot - 类方法")
}
class textVC : textVCRoot {
}
textVC.textforlog() 错误❌
textVC. textforlog6() 错误❌
//Instance member 'textforlog6' cannot be used on type 'textVC';
OC 可以
#import "NSObject+test.h"
@implementation NSObject (test)
-(void)test{
NSLog(@"NSObject+test.h");
}
@end
#import "IsaLearnVC.h"
#import "NSObject+test.h"
@interface subStudent : NSObject
@end
@implementation subStudent
@end
@interface IsaLearnVC ()
@end
@implementation IsaLearnVC
- (void)viewDidLoad {
[super viewDidLoad];
[subStudent test]; //正确✔️
}
@end
所以swift在isa和superClass指针方面和OC 稍有不同
- OC 在底层调用的时候是不分类方法还是对象方法的,只是按照方法名去寻找 类似
objc_msgSend([subStudent class],@selector(test))
//实例对象
Person * person = [[Person alloc] init];
//类对象
Class personClass = [Person class];
//元类对象
Class personMetaClass = object_getClass(personClass);
image.png
image.png
image.png
superClass 指针 不需要进行位运算 直接能找到父类地址值
网友评论