iOS alloc 都干了啥?
2021-03-14 本文已影响0人
司徒新新
先说alloc的执行顺序吧,说完之后在说
总的来说: alloc的运行顺序:
alloc -> _objc_rootAlloc -> callAlloc -> objc_msgSend
但是在callAlloc里会走
_objc_rootAllocWithZone -> _class_createInstanceFromZone
_class_createInstanceFromZone会执行三个方法
cls->instanceSize (先计算出需要的内存大小)
instanceSize (向系统申请开辟内存,返回地址指针)
obj->initInstanceIsa (关联到相应的类)
alloc(为16字节内存对齐)
会对当前对象 生成一个 如果是空的(没有属性的为8字节大小 但是因为字节对齐 所以会生成一个 16字节的内存地址)
如果有属性,里面每一个属性会有8字节的大小
例子 :
如果里面有两个double属性就会为 8(对象本身的地址字节大小) + 8(属性大小) + 8 (属性大小) 共为24字节
但是因为字节对齐的原因 所以会给出一个 32字节的内存地址
内存读取方式 小端模式
读取对象的内存地址 用 x objc (x 跟 po 类似)
对象赋值之后 可以用x打印 objc 很长 也可以使用 x/4gx 编排 打印16进制的地址 直接读内存
然后使用po 读取内存地址 打印值
顺便说一下 init做了什么。。。
什么都没做!!! 只是一个工厂模式,提供给你,让你写构造方法的!
哦! 还有一个new() ,其实就是 alloc init都执行了。并不推荐使用!
睡觉!~~~