目录
- OC对象的类型
- instance(实例)对象
----instance对象内存结构- Class(类)对象
----Class对象内存结构- Meta-class(元类)对象
---- Meta-class对象 内存结构
----Meta-class对象判断
OC对象的类型
Objective-C中的对象,简称OC对象,主要可以分为3种
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)
![](https://img.haomeiwen.com/i6545546/984f37aa5b9ef57d.png)
【一】instance(实例)对象
实例对象就是通过类alloc
出来的对象,每次调用alloc
都会产生新的实例对象。
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
object1、object2是NSObject的instance对象(实例对象) 它们是不同的两个对象
,分别占据着两块不同的内存(16字节)
。
-
instance对象内存结构
在内存中存储的信息包括:
isa指针
其他成员变量
@interface Person : NSObject {
int _age;
}
内存结构为:
![](https://img.haomeiwen.com/i6545546/3c4ab04ce4a6cf8c.png)
isa指针会排在所有成员变量的最前即
内存首地址
,所以isa指针的地址就是instance对象的地址
【二】Class(类)对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
Class objectClass1 = obj1.class;
Class objectClass2 = obj2.class;
Class objectClass3 = object_getClass(obj1); // Runtime API
Class objectClass4 = object_getClass(obj2); // Runtime API
Class objectClass5 = [NSObject class];
NSLog(@"%p,%p,%p,%p,%p",objectClass1,objectClass2,objectClass3,objectClass4,objectClass5);
0x1f04def48,0x1f04def48,0x1f04def48,0x1f04def48,0x1f04def48
总结:
objectClass1~objectClass5
都是NSObject
的类对象,它们都是同一个对象
。
每个类在内存中有且只有一个class
对象。
-
class对象内存结构
isa指针
superclass指针
类的属性信息(@property)
类的对象方法信息(instance method)
类的协议信息(protocol)
类的成员变量信息(ivar)
![](https://img.haomeiwen.com/i6545546/1ef8c10293c70958.png)
【三】Meta-class(元类)对象
获取meta-class对象
Class objectMetaClass = object_getClass([NSObject class]); // Runtime API
objectMetaClass
是NSObject
的meta-class
对象(元类对象),每个类在内存中有且只有一个meta-class
对象。
-
Meta-class对象内存结构
meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的主要信息包括:
isa指针
superclass指针
类的类方法信息(class method)
![](https://img.haomeiwen.com/i6545546/a34369041f60e4a5.png)
object_getClass
方法的实质是返回isa指针指向的内容.
所以如果传入实例对象,返回的是类对象;传入的是类对象,返回的是元类对象。
[obj class]
只能返回类对象,即使调用多次也返回类对象。
objc_getClass
和[obj class]
一样,只能返回类对象。
-
Meta-class对象判断
#import <objc/runtime.h>
// 判断NSObject是否为元类对象
BOOL result = class_isMetaClass([NSObject class])
网友评论