美文网首页
isa和superClass

isa和superClass

作者: 化二缺 | 来源:发表于2020-04-29 09:36 被阅读0次

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 指针 不需要进行位运算 直接能找到父类地址值

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

image.png

相关文章

  • iOS-浅谈OC中isa和superclass的指针指向

    目录 isa指针----isa指针指向superclass指针----class对象的superclass指针--...

  • iOS:isa与superclass

    目录一,对象的三种类型二,对象的存储信息三,isa指针四,superclass指针五,isa和superclass...

  • 笔记 - isa和superclass

    isa的调用 class的superclass meta-class的superclass 总结1 总结2 isa...

  • isa和superclass

    isa指针 将Objective-c代码转换成 C\C++的代码 找到[person personInstance...

  • isa和SuperClass

    开局一张图 刚开始看这图时,我也是懵的 其实也很好理解,这得分开看 虚线 实线 根类、基类 一般都是指:NSObj...

  • isa和superClass

    isa 对象的isa指针是指向哪里的? instance的 isa 指向 class当调用对象方法时,通过inst...

  • isa和superclass

    D、题:对象的isa指针指向哪里? 拓展: class对象的superclass指针指向哪里? meta-clas...

  • isa 和 superclass

    OC对象的分类OC中的对象,简单来说可以分为三大类:instance 对象(实例对象)、class 对象(类对象)...

  • isa 和 superclass

    实例对象的 isa 指向类对象,类对象的 isa 指向元类对象,元类的isa 指向基类的元类对象,基类的元类对象的...

  • isa和superClass

    Objective-C的本质 我们平时编写的Objective-C代码,底层实现其实都是C\C++代码,Objec...

网友评论

      本文标题:isa和superClass

      本文链接:https://www.haomeiwen.com/subject/rmnwwhtx.html