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

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

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

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