彻底搞懂实例对象&类对象&元类对象

243 阅读2分钟

实例对象

通过alloc产生的出来的对象.

实例对象里面包含了

  • 成员变量

没有存储方法,isa是所有实例对象都有的成员变量,因为所有对象都继承

类对象

实例对象的模板,实例对象都是依据类对象创建出来的.

typedef struct objc_class *Class;
// 类对象的本质是一个名为objc_class的结构体

runtime里面对objc_class的定义如下

struct objc_class {
    Class  isa;
    Class  super_class;
    const char *name;
    long version    ;
    long info  ;
    long instance_size  ;
    struct objc_ivar_list *ivars ;
    struct objc_method_list * *methodLists                 
    struct objc_cache *cache ;
    struct objc_protocol_list *protocols;
} ;

class的本质也是结构体,里面也只有一个成员isa

类对象包含如下内容

  • isa
  • superclass指针
  • 类的属性信息@property
  • 类的对象方法信息
  • 类的协议信息
  • 类的成员变量信息

获得类对象

        NSObject *obj = [[NSObject alloc]init];
        NSObject *obj2 = [[NSObject alloc]init];
        NSLog(@"%p",[obj class]);
        NSLog(@"%p",[obj2 class]);
        NSLog(@"%p",[NSObject class]);
        NSLog(@"%p",object_getClass(obj));

2020-09-09 19:46:20.455600+0800 test2[45848:4907643] 0x7fff89cc4580

2020-09-09 19:46:20.456867+0800 test2[45848:4907643] 0x7fff89cc4580

2020-09-09 19:46:20.456976+0800 test2[45848:4907643] 0x7fff89cc4580

2020-09-09 19:46:20.457053+0800 test2[45848:4907643] 0x7fff89cc4580

元类对象

也是class类型的,其实就是特殊的类对象.

元类对象包含如下内容

  • isa指针
  • superclass指针
  • 类的类方法信息

获取元类对象

object_getClass([NSObject class])

[NSObject class]方法获取的始终是类对象不是元类对象

元类对象和类对象的内存结构是一样的

objc_getClass('className'):传入字符串类名,返回类对象

object_getClass(obj):传入的是实例对象,返回类对象,传入类对象,返回元类对象