下班路上突然腦子里冒出來(lái)這個(gè)問(wèn)題,自問(wèn)了一下,很尷尬我也不知道不知道區(qū)別在哪里,那么就分析分析吧,也是對(duì)自己加深一下印象:
- new
目前我見(jiàn)過(guò)的項(xiàng)目里面偶爾會(huì)出現(xiàn)這樣寫(xiě)的坚踩,我個(gè)人搬磚的時(shí)候 幾乎不用它new對(duì)象,至于這個(gè)new到底干啥了:
從網(wǎng)上找了些前輩們的資料和源碼分析瓤狐,現(xiàn)在看下:
創(chuàng)建一個(gè)oc對(duì)象:
NSObject *obj_1 = [[NSObject alloc]init];
NSObject *obj_2 = [NSObject new];
new的實(shí)現(xiàn):
+ (id)new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
return [newObject init];
else
return newObject;
}
alloc/init的實(shí)現(xiàn):
+ (id)alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
- (id)init
{
return self;
}
區(qū)別上從_alloc和_zoneAlloc中可以看出堕虹,new使用了zone,它是給對(duì)象分配內(nèi)存的時(shí)候,把關(guān)聯(lián)的對(duì)象分配到一個(gè)相鄰的內(nèi)存區(qū)域內(nèi)芬首,以便于調(diào)用時(shí)消耗很少的代價(jià)赴捞,提升了程序處理速度。
但如果使用new的話郁稍,初始化方法被固定死只能調(diào)用init.不能再使用init開(kāi)頭的其它初始化方法赦政,據(jù)說(shuō)最初的設(shè)計(jì)是完全借鑒Smalltalk語(yǔ)法來(lái)的,傳說(shuō)那個(gè)時(shí)候已經(jīng)有allocFromZone:這個(gè)方法,只是給對(duì)象分配了內(nèi)存恢着,并沒(méi)有初始化實(shí)例變量桐愉,但是這個(gè)方法需要傳個(gè)參數(shù)id myCompanion = [[TheClass allocFromZone:[self zone]] init];
+ allocFromZone:(voidvoid *) z
{
return (*_zoneAlloc)((Class)self, 0, z);
}
//后來(lái)簡(jiǎn)化為下面這個(gè):
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
總的來(lái)說(shuō),兩種方式創(chuàng)建對(duì)象現(xiàn)在基本上一樣掰派,區(qū)別就是使用new只能默認(rèn)init進(jìn)行初始化从诲,alloc方式可以使用其它的init開(kāi)頭的方法進(jìn)行初始化。