alloc是開辟一個內(nèi)存空間
init是初始化
self=[super init]如果不為nil,就重新分配內(nèi)存空間,這就解釋了為什么 NSString,NSArray的調(diào)用alloc]init]方法后,內(nèi)存地址會不一樣,
但是NSObject為什么會一樣哪,我們知道NSObject是一切類的基類,當(dāng)[[NSString alloc]init]執(zhí)行時, 調(diào)用的[super init]就是 NSObject中的init方法,既然NSObject身為基類,他也就無法調(diào)用super init, 所以 當(dāng)NSObject執(zhí)行 [[NSObject alloc]init]時,也就沒有了init重新分配空間這一環(huán)節(jié)
至于蘋果公司為什么初始化一個實例要分兩步,我個人認(rèn)為是方便構(gòu)造后初始化不同的方法,如果用 new關(guān)鍵字,只能調(diào)用一個init,而不能調(diào)用initwithname等方法.
知識拓展:
NSString alloc之后,沒有init,那么這部分alloc后的內(nèi)存空間可不可以用?答案是顯而易見的,如果可以用,蘋果公司也就沒必要提供一個init方法,那么alloc后的指針稱為什么哪? 懸掛指針.
如果一個地方指針既不為空,也沒有被設(shè)置為指向一個已知的對象,則這樣的指針稱為懸掛指針。在程序里面是很危險的事.
當(dāng)程序運行使用該指針時,程序不能判斷指針的合法性澎剥,將會產(chǎn)生很嚴(yán)重的錯誤锡溯。