对象的底层探索

63 阅读1分钟

一.影响对象内存的因素

1、alloc干啥了? 准备条件:objc4-838.1源码

源码编译 image.png 开始编译

image.png

image.png

image.png

image.png

image.png alloc底层流程如下: [LGPerson alloc] -> objc_msgSend -> _objc_rootAlloc -> callAlloc -> _objc_rootAllocWithZone -> _class_createInstanceFromZone

汇编

image.png 通过objc_msgSend发送一个 alloc 消息,于是我添加一个 [NSObject alloc]符号断点继续往下执行 image.png

对象内存主要包括两类,一是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。