如果想探究OC对象的本质,所以我们需要了解OC这门语言;然后我们也要熟悉研究东西怎么切入
我们平时编写的OC代码,底层实现其实都是C\C++代码
OC -> C\\C++ -> 汇编语言 -> 机器语言
OC的面向对象都是基于C\C++的数据结构实现的
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件
如果涉及ARC,需要增加参数
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 OC源文件 -o 输出的CPP文件
参考 objc开放源码
#import <objc/runtime.h>
#import <malloc/malloc.h>
NSObject *object = [[NSObject alloc] init];
NSLog(@"%ld", class_getInstanceSize([NSObject class])); // 输出8 - 对象真实占用的地址(内存对齐后)
NSLog(@"%ld", malloc_size((__bridge const void *)object));// 输出16 - 系统真正为该对象分配的空间
OC对象最小分配的空间是 16
为了提高内存的访问效率,争取在一个总线周期就把数据读取到。
在iOS中,CoreFoundation限制了对象最小占用的空间大小。
inline size_t instanceSize(size_t extraBytes) const {
if (fastpath(cache.hasFastInstanceSize(extraBytes))) {
return cache.fastInstanceSize(extraBytes);
}
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
}