alloc的运行流程
在iOS开发中我们都会使用 alloc init去创建一个对象。那么在创建对象的时候alloc 和init分别做了什么事情呢?本文中会做出一些探讨。才疏学浅 有不对的地方欢迎指出。
alloc和init对比
在创建对象的时候例如:LYHPerson *person = [[LYHPerson alloc] init],我们会使用这样的形式去创建一个对象。要对alloc和init进行对比的话 就要单独的去写。例如:LYHPerson *p1 = [LYHPerson alloc]; LYHPerson *p2 = [p1 init];然后我们对p1 和p2进行打印如图所示:
运行之后的结果 如图:
从打印结果上来看 我们很容易的发现p1,p2,p3是指向了同一个内存空间的3个不同的指针。综上所述 我们不难看出在进行alloc和init操作的时候。alloc是进行内存空间的创建。init是指向创建内存空间的一个指针。那么alloc是怎么创建内存空间的呢?
alloc 的运行流程
首先 如果我们想知道alloc的运行流程,你需要下载一个alloc的源码。得到源码之后 我们一直按command+鼠标。就能查看到alloc的完整流程。如图所示
如图所示 我们能很清晰的看出alloc的一个运行流程。其中在class_createInstanceFromZone中有三个方法 是alloc在开辟空间时候的核心方法。
方法1. instanceSize 这个方法是用来计算出需要开辟的空间大小。这里我们需要注意一点。在最新的iOS版本中苹果是采取了 16位对齐的方式去创建内存空。摒弃了之前的8位对齐的方式。16位对齐的方式能使程序运行的更加高效。也能防止空指针的出现。
方法2. calloc 这个方法是用来开辟方法1中计算出来的内存空间。并且返回一个isa即一个指向这块内存空间的一个指针。
方法3. initInstancelsa 在这个方法说明之前 首先我们可以在这个方法所在的类里面看到很多命名为cls的一个参数。这个参数就是我们需要创建的对象的类。而方法3就是为了把我们再方法2中返回的指针和cls进行绑定。
以上就是alloc的全部运行流程。