1.Objective-C代码,底层实现其实都是C\C++代码
2.所有Objective-C的面向对象都是基于C\C++的数据结构实现的,Objc对象最终都是转化为C/C++的结构体
OC转C++代码可以通过xcode自带的命令完成
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
常用LLDB指令:
print、p:打印
po:打印对象
x/数量+格式+字节数 内存地址 ( 格式(x:16进制 f:浮点 d:10进制)字节数(b:1字节 h:2字节 w:4字节 g:8字节))
例子: x/4xw 0x100504ed0 表示 每组4个字节以16进制表示打印4组0x100504ed0指向的内存区域。
memory write 内存地址 值 (例子:memory write 0x100504ed1 1f :将0x100504ed1处的值改为1f)
一个NSObject实例对象大小是8个字节(isa指针),分配16个字节 证明:
NSObject *obj = [[NSObject alloc]init];
//获得NSObject类的实例对象的大小
NSLog(@"%zd",class_getInstanceSize([NSObject class]));
//获得obj指针指向内存的大小
NSLog(@"%zd",malloc_size((__bridge const void*)obj));
打印结果:8 16
窥探Objc源码:
//NSObject实际上转化为这种结构体,包含一个成员变量Class 而Class是一个结构体指针,而指针在64位系统中占用8个字节。所以实例对象大小是8个字节
struct NSObject_IMPL {
Class isa;
};
typedef struct objc_class *Class;
#define NANO_MAX_SIZE 256 /* Buckets sized {16, 32, 48, ..., 256} */
64位苹果操作系统堆空间分配内存有内存对齐的概念:分配的内存是16的倍数
1.OC的对象分为:实例对象 , 类对象 ,元类对。存储结构:
他们之间的关系: