OC 对象创建的本质就是用alloc进行创建,用init进行返回。但是为什么init没用任何用处还要写这个呢?这是为了代码的重写。就像我们可以在子类中重写父类的方法时一样的道理。
重点重点重点
oc的实例对象创建的时候最小16个字节。
size 被计算出来之前是需要对齐,加上一个值,苹果中这个值是0.
什么是字节对齐?
arm64中字节对齐是8字节对齐。
3 --》8
9 --》16
其实字节对齐在浪费空间哦。
为什么要字节对齐?
字节对齐这个是用CPU生产厂家不同来处理的。
CPU早期处理方案:重复读取,这样不会挂掉。从偶数位开始写。
方便读取,提高效率,节约空间(X),节约内存(X)。
字节对齐的方法
方法一:
word_align(int x){
return (X +7)/8*8;
}
这个代码效率更高一点。
方法二:
word_align(int x){
return (X +7) >> 3 << 3;
}
方法三:
word_align(int x){
return (X +7) & ~7;
}
方法二和方法三执行效率是一样的,但是方法三更好。因为写代码不要先考虑性能,应该先考虑可维护性。
总结:
1.通过过来的数据算出size_t。
2.真正的内存分配是在calloc分配内存。
分析小技巧:
分析会变汇编,分号之后是注释。
lldb
阅读X0寄存器中的内容:
register read x0
阅读X1寄存器中的内容:
register read x1
端点调试技巧:
加上符号端点alloc,就能进入alloc
在ram64中:
b是跳转指令:跳过去就不再回来了
bl跳转指令,跳进去再出来。 调用函数
x86是另一种指令集
###设置编译器的优化:
str 将w0中的值放到内存中
orr wzr 将0寄存器,其中z
标识zero
编译器的优化设置:Build Settings optimization中更改laver成又快有小。