isa和superclass的总结

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

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

下面是我从网络摘的图:


isa和superclass的总结_第1张图片
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 
@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];也是类似哟

友情链接:

  • 配置运行objc4-750和使用
  • libmalloc-166.200.60之源码编译
  • OC对象本质(一)
  • OC对象的本质(二)
  • OC对象的分类
  • isa的位置以及它的作用
  • superclass的位置以及它的作用
  • isa和superclass的总结
  • OCBasicDemo
  • 配置运行objc4-750和使用
  • libmalloc-166.200.60之源码编译
  • RAC

你可能感兴趣的:(isa和superclass的总结)