在iOS開發(fā)中我們都會使用 alloc init去創(chuàng)建一個對象绞灼。那么在創(chuàng)建對象的時(shí)候alloc 和init分別做了什么事情呢?本文中會做出一些探討粘衬。才疏學(xué)淺 有不對的地方歡迎指出。
alloc和init對比
在創(chuàng)建對象的時(shí)候例如:LYHPerson *person = [[LYHPerson alloc] init],我們會使用這樣的形式去創(chuàng)建一個對象。要對alloc和init進(jìn)行對比的話 就要單獨(dú)的去寫拌夏。例如:LYHPerson *p1 = [LYHPerson alloc]; LYHPerson *p2 = [p1 init];然后我們對p1 和p2進(jìn)行打印如圖所示:
運(yùn)行之后的結(jié)果 如圖:
從打印結(jié)果上來看 我們很容易的發(fā)現(xiàn)p1,p2,p3是指向了同一個內(nèi)存空間的3個不同的指針。綜上所述 我們不難看出在進(jìn)行alloc和init操作的時(shí)候履因。alloc是進(jìn)行內(nèi)存空間的創(chuàng)建障簿。init是指向創(chuàng)建內(nèi)存空間的一個指針。那么alloc是怎么創(chuàng)建內(nèi)存空間的呢栅迄?
alloc 的運(yùn)行流程
首先 如果我們想知道alloc的運(yùn)行流程站故,你需要下載一個alloc的源碼。得到源碼之后 我們一直按command+鼠標(biāo)毅舆。就能查看到alloc的完整流程西篓。如圖所示
如圖所示 我們能很清晰的看出alloc的一個運(yùn)行流程。其中在class_createInstanceFromZone中有三個方法 是alloc在開辟空間時(shí)候的核心方法憋活。
方法1. instanceSize 這個方法是用來計(jì)算出需要開辟的空間大小岂津。這里我們需要注意一點(diǎn)。在最新的iOS版本中蘋果是采取了 16位對齊的方式去創(chuàng)建內(nèi)存空悦即。摒棄了之前的8位對齊的方式寸爆。16位對齊的方式能使程序運(yùn)行的更加高效。也能防止空指針的出現(xiàn)盐欺。
方法2. calloc 這個方法是用來開辟方法1中計(jì)算出來的內(nèi)存空間赁豆。并且返回一個isa即一個指向這塊內(nèi)存空間的一個指針。
方法3. initInstancelsa 在這個方法說明之前 首先我們可以在這個方法所在的類里面看到很多命名為cls的一個參數(shù)冗美。這個參數(shù)就是我們需要創(chuàng)建的對象的類魔种。而方法3就是為了把我們再方法2中返回的指針和cls進(jìn)行綁定。
以上就是alloc的全部運(yùn)行流程粉洼。