美文网首页
isa和superclass的总结

isa和superclass的总结

作者: dandelionYD | 来源:发表于2018-12-28 20:28 被阅读0次

    本文所运行的环境是自己编译好的:配置运行objc4-750和使用
    本文所写的项目详见:OCBasicDemo

    我们从前面的2节,应该大致对isa、superclass应该有了大致的了解了.

    下面是我从网络摘的图:


    image
    • 分析:
      • 1.instance(实例对象)的isa指向class(类对象)
      • 2.class(类对象)的isa指向meta-claaa(元类对象)
      • 3.meta-class(元类)的isa指向基类的meta-class
      • 4.class(类对象)的superclass指向父类的class(类对象)
        • 如果没有父类superclass指向nil
      • 5.meta-class(元类)的superclass指向的是父类的meta-class
      • 6.基类的meta-class的superclass指向基类的class
      • 7.instance(实例对象)调用对象的方法:isa找class(类对象),不存在,则通过superclass去找
      • 8.class(类对象)调用类方法:isa找meta-class(元类),不存在,则通过superclass去找

    示例:

    #import <Foundation/Foundation.h>
    @interface NSObject()
    + (void)test;
    @end
    
    @implementation NSObject (Test)
    - (void)test
    {
       NSLog(@"test被调用啦%p", self);
    }
    @end
    
    
    @interface Person : NSObject
    + (void)test;
    @end
    
    @implementation Person
    @end
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSLog(@"%p", [NSObject class]);//0x100b14140
            NSLog(@"%p", [Person class]);  //0x1000011c0
          
            [NSObject test];//test被调用啦0x100b14140
            [Person test];//test被调用啦0x1000011c0
        }
        return 0;
    }
    

    分析:

    • 1.调用:[NSObject test];我们定义了+ test方法,但是在实现里面没有实现该方法,所以就相当于在元类里面没有找到,此时就会通过superclass指针来找,就去NSObject的class类里面找了,发现里面实现了test方法,执行(-test)
    • 2.对于[Person test];也是类似哟

    友情链接:

    相关文章

      网友评论

          本文标题:isa和superclass的总结

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