isa和superClass

2020-04-29  本文已影响0人  化二缺

isa

各种对象的组成.png
  • 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 指针 不需要进行位运算 直接能找到父类地址值

objc_class 底层结构 objc2以前的就不要拿出来讲了烦

image.png
上一篇 下一篇

猜你喜欢

热点阅读