- 平时编写的OC代码,底层实现都是C/C++代码,编译器再将C/C++代码转化成汇编语言代码,再转化为机器语言代码(0/1),所以OC的面向对象都是基于C/C++的结构体数据结构实现的。
- 不同平台支持的代码是不一样的,Windows、Mac、iOS,模拟器(i386)、32bit(armv7)、64bit(arm64)。
- 将OC代码转化为C/C++代码:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的OC文件
- 一个OC对象在内存中布局:
NSObject的底层实现
@interface NSObject { 在内存中本质 struct NSObject_IMPL {
Class isa; ------------> Class isa;
} };
typedef struct objc_class *Class; Class实际上是一个指向结构体的指针。
所以isa成员在64bit中占据8个字节的内存,结构体也即占8个字节。
isa在内存中的地址值就是结构体的地址值。
创建一个实例对象,至少需要多少内存?
#import <objc/runtime.h>
class_getInstanceSize([NSObject class])
创建一个实例对象,实际上系统分配了多少内存?
#import <malloc/malloc.h>
malloc_size((__bridge const void *)(obj))
NSObject *obj = [[NSObject alloc] init];
// 获得NSObject类的实例对象的大小
NSLog(@"%zd",class_getInstanceSize([NSObject class])); // 8
// 获得obj指针指向内存的大小
NSLog(@"%zd",malloc_size((__bridge const void *)(obj))); // 16
网友评论