2011-05-23 20 views
27

有喜歡什麼是NSZone?使用initWithZone有什麼好處:?

 
1. NSDefaultMallocZone() 
2. NSCreateZone(); 
3. NSRecycleZone(); 
4. NSSetZoneName(); 
5. NSZoneMalloc(); 
and many more related to NSZone 

是什麼意思NSZone,在使用這些功能,當如此多的功能?
initWithZone有哪些優勢:以及如何在我的iPhone應用程序中使用?

回答

38

NSZone是蘋果公司優化 對象分配和釋放的方式。 NSZone 不是一個對象;它是不透明的 C結構存儲關於如何爲一組 對象處理內存的信息。

很少有人需要擔心 在 應用程序中處理您自己的區域;可可以透明地處理它 。在啓動時創建的默認NSZone爲 ,並且所有對象 默認爲在那裏分配。所以 你爲什麼要用你自己的?

如果您正在大量分配數百個廉價對象,您可能會發現實際爲它們分配空間的代價爲 會變得很重要。由於 標準區域一直在使用,因此 可能變得非常不規則;刪除 對象可能在整個內存中留下尷尬的空白 。標準NSZone的分配器知道這一點,並且它 試圖填充這些差距,優先選擇 以從 系統中獲取更多內存,但是如果區域增長得相當大,則這可能在時間上成本高昂 。

如果你想那麼大規模分配對象, ,您可以創建自己的區域, 告訴它不與尋求 差距,提出了新的對象理會該 分配器現在可以跳轉到 結束其每次分配的內存和 快速分配內存到您的新的 對象,節省了大量的努力。 ,

分配器可以節省您的時間 其他地方,也爲要求OS爲 更多的內存,其中一個區需要做 每當它填滿了,是另一個 昂貴的操作,如果它做了很多。 更快的是一次要求大塊內存 ,並且您可以告訴 您的NSZone在這裏也要做什麼。

有傳言說,NSZone能釋放時間節省 你在好老 天,也有方法,簡單地 夾頭了所有的分配內存 也懶得打電話 deallocators。如果一組對象是自包含的,這可以節省很多時間,因爲您可以一次性將所有對象全部刪除 ,而無需繁瑣地將它們全部解除分配。唉, 在當前的文檔中似乎沒有這個天賜之物 的跡象; 單NSZone方法(NSRecycleZone?) 小心地將所有對象整齊排列在默認NSZone上的 區域中。不是 正是一個巨大的節省時間。

因此,總而言之,區域節省您在 質量分配的時間。但只有當 程序員知道如何使用它們!

CocoaDev

+8

另外需要注意的是,如果你使用ARC不能使用NSZone了。你應該這樣做。 – Adam 2013-01-24 01:10:35

+0

@亞當,如果您也可以添加引用,我認爲該評論值得添加到答案中。 – 2013-08-04 07:10:43

+1

從https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW11:「您不能使用內存區域。不需要再使用NSZone - 無論如何它們被現代Objective-C運行時忽略。「基礎功能文檔表明,iOS和64位OSX運行時確實忽略了區域。 – Norswap 2013-11-27 12:59:23