一、OC 底层原理
1、object-c-->c/c++-->汇编语言-->机器语言
2、一个NSObject对象占用多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
但NSObject对象内部只使用了8个字节的空间(在64bit环境下,可以通过class_getInstanceSize函数获得)
#import <objc/runtime.h>
#import <malloc/malloc.h>
// 获得NSObject实例对象的成员变量所占用的大小 >> 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
// 获得obj指针所指向内存的大小 >> 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
3、常用的LLDB命令
image.png
4、内存对齐:结构体的大小必须是最大成员大小的倍数
5、oc分配内存 桶的概念 16 32 48 64 80 96 112 都是16的倍数
二、OC对象的分类
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)
instance对象
1、instance对象都是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
2、instance对象在内存中存储的信息包括
- isa指针
- 其他成员变量
class对象
1、可以通过以下方法获取class对象
image.png
他们是同一个对象。每个类在内存中有且只有一个class对象
2、class对象在内存中存储的信息包括
- isa指针
- superclass指针
- 类的属性信息(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)
meta-class对象
1、可以通过下边方法获取meta-class对象
image.png
image.png
image.png
每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象内存结构是一样的,但是用途不一样
2、meta-class对象字内存中存储的信息包括
- isa指针
- superclass指针
-
类的类方法信息方法
runtime 获取object_getClass方法
instance对象、class对象、meta-class对象之间的联系
1、调用类的方法:本质就是runtime中的msg_send方法
image.png
2、isa指针指向
image.png
3、class对象的superclass指针
image.png
4、meta-class对象的superclass指针
image.png
5、总结
image.png
6、从64bit开始,isa需要进行一次位运算,才能计算出实际地址
image.png
7、窥探struct objc_class的结构
image.png