zoukankan      html  css  js  c++  java
  • isa、superclass调用总结

    isa的调用过程

    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找父类

    isa调用的如图所示:

    最重要的一点,调用类方法如果本类中找不到,回去父类中找,如果到最后也找不到,会调用元类的对象方法,如果还找不到就会报错

    NSObject分类代码如下:

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface NSObject (test)
    - (void)instanceTest;
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "NSObject+test.h"
    
    @implementation NSObject (test)
    - (void)instanceTest {
        NSLog(@"这是对象方法");
    }
    @end

    在main.m中调用:

    #import <Foundation/Foundation.h>
    #import <objc/runtime.h>
    #import "NSObject+test.h"
    
    
    @interface Person : NSObject
    @end
    
    @implementation Person
    @end
    
    @interface Student : Person
    @end
    
    @implementation Student
    @end
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
    
            [Student instanceTest];
        }
        return 0;
    }

    结果并不会报方法找不到的错误,也证明了上述观点

  • 相关阅读:
    SDN作业(4)
    SDN作业(3)
    第一次个人编程作业
    SDN作业(2)
    SDN作业(1)
    第一次博客作业
    浅谈闭包
    预编译And作用域链
    定时器
    window事件
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/14008456.html
Copyright © 2011-2022 走看看