一.影响对象内存的因素
1、alloc干啥了? 准备条件:objc4-838.1源码
源码编译
开始编译
alloc底层流程如下:
[LGPerson alloc] -> objc_msgSend -> _objc_rootAlloc -> callAlloc -> _objc_rootAllocWithZone -> _class_createInstanceFromZone
汇编
通过
objc_msgSend发送一个 alloc 消息,于是我添加一个 [NSObject alloc]符号断点继续往下执行
对象内存主要包括两类,一是isa指针,另一个是成员变量的值。
二.对象的内存分配
在分配对象内存空间对齐方式是以16字节作为内存对齐的。
为什么要在分配对象内存空间以16字节对齐呢?
这里涉及到空间换时间的概念,这是因为cpu在读取内存的时候是不是以字节为单位,而是以内存块为单位,它可以每次读2个字节,但是会造成大量计算,cpu效率会很低很低,也可以每次读32字节,无疑可能造成空间浪费,在大量试验读取的方式,最终选用以16字节对齐的方式。
结论:
a.调用[LGPerson alloc]就能返回类的实例对象了。
b.alloc对象分配内存最终底层会走malloc。(ps: swift底层也是malloc)
c.在计算对象的内存对齐方式是以8字节作为内存对齐的,
在分配对象内存空间对齐方式是以16字节作为内存对齐的。
自动重排成员变量的顺序
三.init方法
啥也没干,直接返回了对象了。所以苹果设计这个init方法有什么作用呢?
苹果设计init方法是以工厂模式思想,给子类重写init,以提供子类的成员变量赋值操作。
四.new方法
new 方法相当于 alloc init。