1.new和alloc的區(qū)別
//源碼實(shí)現(xiàn)
+ new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
return [newObject init];
else
return newObject;
}
//而 alloc/init 像這樣:
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
- init
{
return self;
}
[className new]基本等同于[[className alloc] init]祟辟,區(qū)別只在于alloc分配內(nèi)存的時(shí)候使用了zone医瘫,它是給對(duì)象分配內(nèi)存的時(shí)候,把關(guān)聯(lián)的對(duì)象分配到一個(gè)相鄰的內(nèi)存區(qū)域內(nèi)旧困,以便于調(diào)用時(shí)消耗很少的代價(jià)醇份,提升了程序處理速度;
而為什么不推薦使用new吼具?
如果使用new的話僚纷,初始化方法被固定死只能調(diào)用init,采用alloc的方式可以用其他定制的初始化方法拗盒。
[NSArray new]和[[NSArray alloc] init]返回一個(gè)保留計(jì)數(shù)為1的數(shù)組.在ARC之前,您必須釋放或自動(dòng)釋放該陣列,否則您將泄漏內(nèi)存.
[NSArray數(shù)組]和@ []返回一個(gè)已經(jīng)自動(dòng)釋放的數(shù)組(保留計(jì)數(shù)0).如果你想讓它在沒(méi)有ARC的情況下堅(jiān)持下去,你必須手動(dòng)保留它,否則當(dāng)彈出當(dāng)前自動(dòng)釋放池時(shí)它將被釋放.