总结:
-
- OC底层是c/c++实现的
-
- 将Objective-C代码转换为C\C++代码:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件
-
- OC对象是基于c/c++的结构体实现的
-
- OC对象的底层结构体:包含一个isa指针,该指针为
struct objc_class *
类型
- OC对象的底层结构体:包含一个isa指针,该指针为
struct NSObject_IMPL { Class isa; };
-
- oc对象的内存布局:
- oc对象的内存布局:
-
- 创建一个实例对象,至少需要多少内存?使用
class_getInstanceSize([NSObject class]);
可获得
- 创建一个实例对象,至少需要多少内存?使用
-
创建一个实例对象,实际上分配了多少内存?使用
malloc_size((__bridge const void *)obj);
可获得,两个函数都需要导入#import <malloc/malloc.h>
-
底层在alloc时,会调用
allocWithZone
->_objc_rootAllocWithZone
->_class_createInstanceFromZone
,在_class_createInstanceFromZone中会获得需要分配的size,在instanceSize
中会通过alignedInstanceSize去获取内存大小,注意这里的内存size是对齐过的,之后会判断是否小于16,所以分配的内存最少是16字节 `size_t size = alignedInstanceSize() + extraBytes; // CF requires all objects be at least 16 bytes. if (size < 16) size = 16; return size;
`
问题:
- 一个NSObject对象占用多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得); 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)