兩段構(gòu)造模式是指創(chuàng)建對象需要先調(diào)用alloc方法或allocWithZone方法(已廢棄),再調(diào)用init方法或initWithSomething方法。列如:
NSString * str = [[NSString alloc] initWithString:@""];
alloc(分配內(nèi)存等) 和 init(真正的初始化)
而大部分其他語言都使用“new” 一次性創(chuàng)建對象。
在后來,蘋果也引入了類方法:new。但是由于歷史原因,init方法是實例方法而非類方法,所以作為類方法的new,只能簡單地等價于 alloc + init,不能指定init的參數(shù),所以用處不大。蘋果在設(shè)計上也禁止多次調(diào)用init方法,例如如下代碼會拋出 NSInvalidArgumentException。
NSString * str = [NSString new];
str = [str initWithString:@"Bar"];
這里提到oc使用兩段構(gòu)造模式主要是因為歷史原因,因為oc語言(1983)也是出現(xiàn)的比較早,那時候程序員還需要比較關(guān)心內(nèi)存具體的分配方案,在歷史上,alloc不僅僅是分配內(nèi)存,還可以詳細的指定該內(nèi)存所在的內(nèi)存分區(qū)(用NSZone表示),因為在這種情況下,alloc要處理的情況復(fù)雜,和init放到一起不合適。
而對于大多數(shù)出生在90年代的語言來說(例如Java,JavaScript,C#),由于內(nèi)存具體的分配方案都不需要程序員操心了,所以就不需要單獨為內(nèi)存分配實現(xiàn)一個alloc方法了。