我们平时编写的Objective-C代码,底层实现其实都是C\C++代码
所以Objective-C的面向对象都是基于CC++的数据结构实现的(结构体)
将Objective-C代码转换为C\C++代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件
如果需要链接其他框架,使用-framework参数。比如-framework UIKit
什么平台的代码
不同平台支持的代码肯定是不一样
Windows. mac、 ios
模拟器(i386)、32bit(armv7)、64bit(arm64)
一个OC对象在内存中是怎么布局的
NSObject 的底层实现
@interface NSObject {
Class isa;
}
@end
对应:
struct NSObject_IMPL {
Class isa;
}
typedef struct objc_class * Class;
一个Student对象
@interface Student: NSObject {
@public
int _no;
int _age;
}
struct Student_IMPL {
Class isa;
int _no;
int _age;
}
一个Person对象、一个Student对象占用多少内存空间?
继承的话: 子类中肯定有一个父类的结构
实时查看内存中的数据
在Xcode- Debug workfllow- View Memory
输入对应对象的内存地址
使用LLDB指令
iOS中常用的LLDB指令
两个容易混淆的函数
#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));
Core Foundation 内部规定:对象最少16个字节;如果小于16 直接等于16
内存对齐机制:结构体的大小必须是最大成员大小的倍数
常见面试题
一个NSObject对象占用多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
tip: 大端 小端 (cpu)
iOS中都是小端模式: 读数据是从高地址开始读的