文章目录
OC对象的分类
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
1. instance对象
- instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
- obj1、obj2都是 NSObject 的 instance 对象
- 他们是不同的两个对象,分别占用这两块不同的内存
1.2 instance对象在内存中存储的信息包括
isa
指针- 其他
成员变量
1.2.1 假设有Person类
@interface Person : NSObject {
@public
int _age;
}
@end
@implementation Person
@end
- 实例化 p1、p2,并对他们的_age 成员赋值
Person *p1 = [[Person alloc] init];
p1->_age = 3;
Person *p2 = [[Person alloc] init];
p2->_age = 4;
- 它们在内存中是这样的
2. class对象
- 每个类在内存中只有一个类对象
- class方法返回的一直是class对象(类对象)
2.1 获取class对象
通过以上几种方式,获取到的Class对象都是同一个,即class(类对象)
2.2 class对象在内存中存储的信息主要包括
isa
指针supperclass
指针- 类的
属性信息
、类的对象方法
(减号-开头的方法) - 类的
协议信息
(protocol)、类的成员变量
(ivar)
3. meta-class对象
- 每个类在内存中只有一个元类对象
- 获取元类对象 调用runtime的
object_getClass()
方法,需要传入类对象 - 判断是否是元类对象:class_isMetaClass()
// meta-class 元类对象
Class metaClass = object_getClass([NSObject class]);
bool isMeta = class_isMetaClass(metaClass);
NSLog(@"%id", isMeta);
2.2 meta-class元类对象在内存中存储的信息主要包括
isa
指针supperclass
指针- 类的
类方法
信息(加号+开头的方法)
2.3 注意
Class objectClass = [[NSObject class] class];
获取的并不是元类对象,而是类对象。
4. 窥探几个方法的实现
4.1 object_getClass
- 传入obj可能是 instance 对象、class 对象、meta-class 对象
- 返回值
-
- 如果是 instance 对象,返回 class 对象
-
- 如果是 class 对象,返回 meta-class 对象
-
- 如果是 meta-class 对象,返回 NSObject(基类)的 meta-class 对象
之所以传入不同对象,返回不同的类对象,关键在意 getIsa()方法。详细原因了解后面isa的指向后即可清楚
4.2 objc_getClass
传入字符串类名
返回对应的类对象
4.3 - (Class)class、+(Class)class
返回的就是类对象
@oubijiexi