- 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)
-