iOS底层原理 -- 对象的分类

2018-12-08  本文已影响10人  X_L_F
OC对象分类
// main.m
#import <Foundation/Foundation.h>
#import <objc/runtime.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /**
        *  object_getClass方法是获取对象的对象
        */
        NSObject *objc = [[NSObject alloc] init];    // 实例
        Class class = [objc class];        // 类对象
        Class metaClass =  object_getClass(class);    // 元类对象
        NSLog(@"%p, %p, %p", objc, class, metaClass);
    }
    return 0;

}

result: 0x102a02690, 0x7fffb120c140, 0x7fffb120c0f0

通过上述方法可以获知三个对象的内存地址不同,即对应的三种对象。

对象存放的信息
  1. 实例对象
    存放成员变量的具体指
  2. 类对象
    存放属性(如属性的命名、类型等)、对象方法、协议等信息
  3. 元类对象
    存放类方法

实际上类对象与元类对象结构一样,但作用不用。即元类对象中也含有属性、协议等内存空间。但是不起作用罢了。

isa指针与superclass指针
isa指针与superclass指针

以问题的形式,总结如下
is 指针指向哪里?

  1. 实例对象isa指针指向类对象
  2. 类对象isa指针指向元类对象
  3. 元类对象isa指针指向基类的元类对象
  4. 基类元类对象的isa指针指向自己

superclass 指针指向哪里?

  1. 实例对象superclass指针指向父类
  2. 类对象superclass指针指向父类
  3. 基类类对象superclass 为nil。(即无父类,superclass为nil)
  4. 元类对象superclass指针指向父类
  5. 基类元类对象superclass指向基类类对象。
上一篇下一篇

猜你喜欢

热点阅读