NSZone可以想象成一個(gè)內(nèi)存池脑豹,alloc或是dealloc這些操作,都是在這個(gè)內(nèi)存池中操作的拒担。
Cocoa總是會(huì)配置一個(gè)默認(rèn)的NSZone淹办,任何默認(rèn)的內(nèi)存操作都是在這個(gè)“zone”上操作的。默認(rèn)的NSZone的缺陷在于械哟,它是全局范圍的盯串,時(shí)間一長(zhǎng),必然會(huì)導(dǎo)致內(nèi)存的碎片化戒良,如果你需要大量的alloc一些object体捏,那么性能就會(huì)受到一些影響。
所有cocoa提供方法糯崎,你可以自己生成一個(gè)NSZone几缭,并將alloc, copy全部限制在這個(gè)”zone“之內(nèi)。
CocaDev的wiki:http://cocoadev.com/wiki/NSZone
NSZone是Apple用來分配和釋放內(nèi)存的一種方式沃呢,它不是一個(gè)對(duì)象年栓,而是使用C結(jié)構(gòu)存儲(chǔ)了關(guān)于對(duì)象的內(nèi)存管理的信息”∷基本上開發(fā)者是不需要去理會(huì)這個(gè)東西的某抓,cocoa Application使用一個(gè)系統(tǒng)默認(rèn)的NSZone來對(duì)應(yīng)用的對(duì)象進(jìn)行管理纸兔。那么在什么時(shí)候你會(huì)想要有一個(gè)自己控制的NSZone呢?當(dāng)默認(rèn)的NSZone里面管理了大量的對(duì)象的時(shí)候否副。這種時(shí)候汉矿,大量對(duì)象的釋放可能會(huì)導(dǎo)致內(nèi)存嚴(yán)重碎片化,cocoa本身有做過優(yōu)化备禀,每次alloc的時(shí)候會(huì)試圖去填滿內(nèi)存的空隙洲拇,但是這樣做的話時(shí)間的開銷很大。于是乎曲尸,你可以自己創(chuàng)建一個(gè)NSZone赋续,這樣當(dāng)你有大量的alloc請(qǐng)求的時(shí)候就全部轉(zhuǎn)移到指定的NSZone里面去,減少了大量的時(shí)間開銷另患。而且纽乱,使用NSZone還可以一口氣把你創(chuàng)建的zone里面的東西都清除掉,省掉了大量的時(shí)間去一個(gè)個(gè)dealloc對(duì)象昆箕∑妊停總的來說,當(dāng)你需要?jiǎng)?chuàng)建大量的對(duì)象的時(shí)候为严,使用NSZone還是能節(jié)省一些時(shí)間的敛熬,不過前提是你得知道怎么去用它。
另一篇2002年的文章就說開發(fā)者已經(jīng)不能創(chuàng)建一個(gè)真正的NSZone了(看來也許這就是歷史原因了)第股,只能創(chuàng)建main zone的一個(gè)child zone应民。
Timothy J.wood 的回答
Timothy還講到如果可以使用NSZone的話,多個(gè)對(duì)象在同一時(shí)間alloc可以減少分頁使用夕吻,而且在同一個(gè)時(shí)間dealloc可以減少內(nèi)存碎片诲锹。Apple在這方面是做了處理了,對(duì)開發(fā)者透明涉馅,無需開發(fā)者自己去做归园。
allocWithZone不被Apple鼓勵(lì)使用,基本上多數(shù)時(shí)候程序員也不需要自己去管理自己的zone稚矿。