iOS底层原理 -- 对象的分类
2018-12-08 本文已影响10人
X_L_F
OC对象分类
- 实例对象
- 类对象
- 元类对象
// main.m
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
/**
* object_getClass方法是获取对象的对象
*/
NSObject *objc = [[NSObject alloc] init]; // 实例
Class class = [objc class]; // 类对象
Class metaClass = object_getClass(class); // 元类对象
NSLog(@"%p, %p, %p", objc, class, metaClass);
}
return 0;
}
result: 0x102a02690, 0x7fffb120c140, 0x7fffb120c0f0
通过上述方法可以获知三个对象的内存地址不同,即对应的三种对象。
对象存放的信息
- 实例对象
存放成员变量的具体指 - 类对象
存放属性(如属性的命名、类型等)、对象方法、协议等信息 - 元类对象
存放类方法
实际上类对象与元类对象结构一样,但作用不用。即元类对象中也含有属性、协议等内存空间。但是不起作用罢了。
isa指针与superclass指针
isa指针与superclass指针以问题的形式,总结如下
is 指针指向哪里?
- 实例对象isa指针指向类对象
- 类对象isa指针指向元类对象
- 元类对象isa指针指向基类的元类对象
- 基类元类对象的isa指针指向自己
superclass 指针指向哪里?
- 实例对象superclass指针指向父类
- 类对象superclass指针指向父类
- 基类类对象superclass 为nil。(即无父类,superclass为nil)
- 元类对象superclass指针指向父类
- 基类元类对象superclass指向基类类对象。