凱文和羅賓的答案是最準確的。奧斯卡的回答非常接近正確。但是,Gnustep文檔和logancautrell關於區域存在的原因都是非常正確的。
區域最初創建 - 首先是NXZone,然後是NSZone - 確保從單個區域分配的對象在內存中相對連續,這是事實。事實證明,這不會減少應用程序使用的內存量;在大多數情況下,它會略微增加它。
更大的目的是能夠大規模摧毀一組物體。
例如,如果要將複雜的文檔加載到基於文檔的應用程序中,那麼在文檔關閉時拆除對象圖實際上可能會非常昂貴。
因此,如果爲一個文件中的所有對象都從一個單一的區和分配給該區域的分配的元數據是也在該區域中,然後與文檔相關的所有對象的破壞將是作爲作爲廉價簡單地摧毀區域(這真的很便宜 - 「這裏,系統,這些頁面回來」 - 一個函數調用)。
這被證明是行不通的。如果對該區域中的某個對象的單個引用泄露出該區域,則在文檔關閉時應用程序將立即執行BOOM,並且該對象無法通知引用該對象停止的任何內容。其次,這種模式也成爲GC'd系統經常遇到的「稀缺資源」問題的犧牲品。也就是說,如果文檔的對象圖保存在非內存資源上,則在區破壞之前無法有效地清理所述資源。最後,一個表現勝利(通常你真的關閉複雜文檔的頻率)與所有附加脆弱性的結合使得區域成爲一個糟糕的主意。儘管如此,改變API的時間已經太晚了,我們仍然留下了痕跡。
太棒了,我希望你能回答這個問題。注意,這是在任何時候在Apple文檔中記錄的?我今天可以找到的是NSZone *基礎方法。 – logancautrell
如果有這樣的問題想要引起我的注意,請隨時關注@bbum我的Twitter。語言(和操作系統)的發展真的很吸引人。如果有記錄的話,它可能是在狂想曲日子裏剩下的。我認爲在適當的Mac OS X版本中不推薦使用區域。 – bbum
我明白,你的帖子因爲你獨特的位置和歷史而被高度評價。我希望更多的蘋果工程師在這裏逗留! – logancautrell