在iOS開發(fā)中我們都會使用 alloc init去創(chuàng)建一個對象。那么在創(chuàng)建對象的時候alloc 和init分別做了什么事情呢?本文中會做出一些探討。才疏學(xué)淺 有不對的地方歡迎指出。
alloc和init對比
在創(chuàng)建對象的時候例如:LYHPerson *person = [[LYHPerson alloc] init],我們會使用這樣的形式去創(chuàng)建一個對象。要對alloc和init進(jìn)行對比的話 就要單獨的去寫。例如:LYHPerson *p1 = [LYHPerson alloc]; LYHPerson *p2 = [p1 init];然后我們對p1 和p2進(jìn)行打印如圖所示:

運行之后的結(jié)果 如圖:

從打印結(jié)果上來看 我們很容易的發(fā)現(xiàn)p1,p2,p3是指向了同一個內(nèi)存空間的3個不同的指針。綜上所述 我們不難看出在進(jìn)行alloc和init操作的時候。alloc是進(jìn)行內(nèi)存空間的創(chuàng)建。init是指向創(chuàng)建內(nèi)存空間的一個指針。那么alloc是怎么創(chuàng)建內(nèi)存空間的呢?
alloc 的運行流程
首先 如果我們想知道alloc的運行流程,你需要下載一個alloc的源碼。得到源碼之后 我們一直按command+鼠標(biāo)。就能查看到alloc的完整流程。如圖所示

如圖所示 我們能很清晰的看出alloc的一個運行流程。其中在class_createInstanceFromZone中有三個方法 是alloc在開辟空間時候的核心方法。
方法1. instanceSize 這個方法是用來計算出需要開辟的空間大小。這里我們需要注意一點。在最新的iOS版本中蘋果是采取了 16位對齊的方式去創(chuàng)建內(nèi)存空。摒棄了之前的8位對齊的方式。16位對齊的方式能使程序運行的更加高效。也能防止空指針的出現(xiàn)。
方法2. calloc 這個方法是用來開辟方法1中計算出來的內(nèi)存空間。并且返回一個isa即一個指向這塊內(nèi)存空間的一個指針。
方法3. initInstancelsa 在這個方法說明之前 首先我們可以在這個方法所在的類里面看到很多命名為cls的一個參數(shù)。這個參數(shù)就是我們需要創(chuàng)建的對象的類。而方法3就是為了把我們再方法2中返回的指針和cls進(jìn)行綁定。
以上就是alloc的全部運行流程。