簡體   English   中英

內存管理基礎知識-目標C

[英]Memory Management Basics - Objective C

我對對象,內存和保留有一個一般性的問題。

我不是一個完整的新手(我在iTunes Store上有出售的應用程序),但是某些東西一定已經溜走了。 我使用Google Docs API,昨天我正在下載電子表格供稿,並枚舉結果,即電子表格記錄供稿。

在將對象枚舉並添加到字典之后,在循環轉到下一個Record之前,將字典添加到數組中。 因此,經過5次遍歷之后,該數組有5個對象,每條記錄一個字典,每個字典都有值。 奇怪的是,最后,陣列有5個相同信息的副本。 每次循環時,字典都會像預期的那樣進行更改,但是當我將其插入數組時,數組中的其他對象也會更改為匹配。

我仔細研究了StackOverflow上的一些內容,並找到了嘗試的建議:

[array insertObject:[dictionary copy] atIndex:0];

這樣就解決了。 添加復制方法可使一切正常工作。

我只是想知道為什么。

通常,將對象放入數組后,即使原始對象被修改或破壞,它也保持完整。

你誤會了。 數組(和Cocoa中的所有其他容器類)永遠不會那樣工作。 它們僅存儲對其包含的對象的引用(並保留它們),因此,如果您從數組中檢索它們(因為它們是相同的對象),則原始對象的任何更改都將反映出來。

當然,通過調用copy可以創建字典的副本,因此現在您要處理單獨的對象。 同時,您現在正在泄漏內存,因為您負責釋放從copy返回的對象。

另外,請記住, copy僅是淺表復制,因此復制的字典的實際內容不會被復制。 如果更改字典的內容,這些更改將反映在兩個字典中(“原始”字典和已添加到數組中的副本)。

當您將一個對象(我們稱其為X)插入數組時,實際上放置到數組中的是指向 X的指針的副本,而不是X本身的副本。 向X發送了一條retain消息,以便該陣列可以保留它,但是沒有向X發送一條copy消息。 這意味着以后對X的更改影響數組中“存儲”的對象。

警告:建議的解決方案會導致大量內存泄漏,因為從不釋放復制的數據。 更好的解決方案是自動釋放復制的數組,以便在釋放數組時將其釋放。

[array insertObject:[[dictionary copy] autorelease] atIndex:0];

或者,對於iPhone代碼(在這種情況下, 自動發布可能很糟糕 ,尤其是在循環中):

NSDictionary * newDict = [dictionary copy];
[array insertObject:newDict atIndex:0];
[newDict release];

更新:確保還閱讀Ole Begemann的答案 他對字典的深層副本和淺層副本提出了很好的觀點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM