OC对象的分类

instance对象(实例对象)就是通过类alloc出来的对象,每次类调用alloc都会生成一个新的instance对象。instance对象在内存中存储的主要信息有:

  • isa指针
  • 其他类的成员变量(值)
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

obj1和obj2就是两个NSObject的实例对象,分别占据两块的不同的内存。

class对象

每个类在内存中有且只有一个class对象(类对象),class对象在内存中存储的主要信息有:

  • isa指针
  • superclass指针
  • 类的属性信息(@property)
  • 类的对象方法信息(instance method)
  • 类的协议信息(protocol)
  • 类的成员变量信息(类型,名称)

下面代码获取到的都是NSObject类对象:

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
Class objClass1 = [obj1 class];
Class objClass2 = [obj2 class];
Class objClass3 = [NSObject class];
Class objClass4 = object_getClass(obj1);
Class objClass5 = object_getClass(obj2);
Class objClass6 = objc_getClass("NSObject");

meta-class对象

每个类在内存中有且只有一个meta-class对象(元类对象)。meta-class对象和class对象的内存结构是一样的,但是用途不一样。meta-class对象在内存中存储的主要信息有:

  • isa指针
  • superclass指针
  • 类方法信息(class method)
  • ……

下面代码获取到的metaClass就是NSObject的meta-class对象:

Class metaClass = object_getClass([NSObject class]);

可以通过 class_isMetaClass 方法判断一个Class对象是否为meta-class对象。

需要注意的是,以下代码获取到的是Class对象,并不是meta-class对象:

Class objClass = [[NSObject class] class];
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章