- OC对象主要可以分为3种:
instancet对象(实例对象)class对象(类对象)meta-class对象(元类对象)
instancet对象:instancet对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象object1、object2是NSObject的NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init];instance对象(实例对象),他们是不同的两个对象,分别占据 着两块不同的内存。instancet对象存储的信息:isa指针- 其他
成员变量
class对象:-
获取
class对象的三种方法:NSObject *obj1 = [[NSObject alloc] init]; NSObject *obj2 = [[NSObject alloc] init]; Class objectClass1 = [obj1 class]; Class objectClass2 = [obj2 class]; Class objectClass3 = [NSObject class]; Class ObjectClass4 = object_getClass(obj1); Class ObjectClass5 = object_getClass(obj2);objectClass1 ~ objectClass5都是同一个对象,每个类在内存中只有一个class对象。
在编译器中进行验证:不管用什么方式获取类对象,内存地址都一样:
-
class对象存储的信息:isa指针superclass指针- 类的
属性信息(@property) - 类的
对象方法信息(instance method) - 类的
协议信息(protocol) - 类的
成员变量信息(ivar):这个指的不是成员变量的值,而是成员变量的类型、名称相关信息
-
总结:class对象中存储的信息都是只需要存一份的信息
-
meta-class对象:-
获取
meta-class对象的方法:Class objectMetaClass = object_getClass([NSObject class]);通过
object_getClass方法,传入类对象,即可获得元类对象。 每个类在内存中只有一个meta-class对象。在编译器中进行验证:发现
元类对象的地址和类对象的地址不一样 -
meta-class对象和class对象的内存结构是一样的,因为都是Class指针指向,但是用途不一样,在内存中存储的信息主要包括:isa指针superclass指针- 类的
类方法信息(class method)
-