談ObjC對象的兩段構(gòu)造模式

兩段構(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方法了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容