Objective-C的本质
-
我们平时编写的Objective-C代码,底层实现其实都是C\C++代码
1.png - 所以Objective-C的面向对象都是基于C\C++的数据结构实现的
- Objective-C的对象、类主要是基于C\C++的结构体实现的
- 将Objective-C代码转换为C\C++代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc
OC源文件-o
输出的cpp文件,(PS: 模拟器(i386)、32bit(armv7)、64bit(arm64))
一个OC对象在内存中的布局
-
NSObject的底层实现
2.png
代码获取内存大小
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
struct NSObject_IMPL {
Class isa; //8个字节
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = [[NSObject alloc] init];
//获得NSObject实例对象的成员变量所占用的大小 >>8
NSLog(@"%zd",class_getInstanceSize([obj class]));
//获得obj指针所指向内存的大小 >>16
NSLog(@"%zd",malloc_size((__bridge const void *)(obj)));
}
return 0;
}
面试题
- 一个NSObject对象占用多少内存
1、系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
2、但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
网友评论