alloc的底层为什么是objc_alloc
- 我们首先alloc一个LGPerson对象,并且断点。
- 然后step into(直接点击即可)。
- 会进入底层的alloc方法,然后发现底层调用的并不是objc_alloc而是_objc_rootAlloc
4. 但如果我们在第二步同时按住control再step into会进入汇编命令,然后发现调用的又是objc_alloc,有点奇怪
-
于是我们在objc源码工程中搜索objc_alloc发现了该方法,该方法接收到的msg的sel如果是alloc,则将对应msg的imp修改为objc_alloc,也就是修改了sel和imp的绑定,但是从方法名看出这似乎是出了错误之后的“fixup”,那么正常情况下是怎样的呢?我们只能从更底层的llvm一探究竟。
-
未完待续
结构体内存对齐
示例1
// 正常结构体
struct LGStruct1 {
double a; // 8 [0 7]
char b; // 1 [8]
int c; // 4 (9 10 11 [12 13 14 15]
short d; // 2 [16 17]
// 该结构体总大小为24
}struct1;
示例2
// 结构体嵌套
struct LGStruct2 {
double a; // 8 [0 7]
int b; // 4 [8 9 10 11]
char c; // 1 [12]
short d; // 2 (13 [14 15]
int e; // 4 [16 17 18 19]
struct LGStruct1 str; // 24 (19 20 21 22 23 [24 25...41 47]
// 该结构体的总大小必须为double的整数倍,所以是最终总大小为48
}struct3;