2011-09-01 47 views
0

我已經編寫了一個包含自定義搜索類的應用程序。這會建立一系列結果。iOS發佈對象太早 - 可能與Autorelease和Copy混淆

我然後分配數組到我FirstViewController類,並重新加載它有分配給它的結果數組表視圖

self.aResults = [thisSearch.aResults copy] 
... 
[[self searchResults] reloadData]; 

這樣做,我釋放後不久thisSearch

[thisSearch release]; 

這一切都正常工作,並顯示結果表,但如果我向下滾動表格並查看下面的行,它們都是空白的,然後當我重新加載循環表cel時滾動備份應用程序崩潰LS。

這不是發生在我面前,但我意識到我是泄漏內存,讓我去自動釋放瘋狂,並增加了很多自動釋放到我搜索類。但不是我的FirstViewController類。

因此,如果我使用複製,它實際上沒有做一個對象的副本,它只是增加引用計數器?所以,當我摧毀搜索,我摧毀在那裏的結果數組,並因此破壞FirstViewController試圖訪問表視圖?

對不起,如果沒有多大意義,我今天感覺不太好。

+0

而不是'self.aResults = [thisSearch.aResults copy]'你應該做'@property(nonatomic,copy)NSArray * aResults;'這樣的aResults拷貝屬性。然後當你設置這個屬性時,它會自動獲得你設置它的對象的副本。當完成aResults內部的任何操作時,執行'self.aResults = nil',它將被釋放。我還沒有提交這個答案,因爲它只是一個提示,但這不是你的應用程序崩潰的原因。沒有更多的代碼,我不知道它爲什麼會這樣做。 –

回答

1

當你copy對象(這樣做的那個對象必須符合NSCopying協議但是這是NSArray的情況下),它是完全一樣的,如果你是init ializing它首次與predifined值。

所以它是release對象copied的責任。

Thefore你必須做到:

self.aResults = [thisSearch.aResults copy] 
... 

[thisSearch release]; // When you release thisSearch this will not affect aResults 
... 

// then you can either do: 
[self.aResults autorelease]; // but then do not release it later on 
// or 
[self.aResults release]; // when you're done with it 

但我懷疑這會解決你的內存問題。通過自動釋放(並且仍然釋放東西),您可能已經完全破壞了您的應用程序內存管理。

要嘗試修復它,請嘗試分析您的項目,看看會發生什麼。

enter image description here

此外,我附上Apple Memory Management link一個人應該讀月,直到它成爲第二天性。

+0

Aaaah我應該跑分析!我運行它,它指向我一個NSDicitonary,我正在autoreleasing,並告訴我參考計數器已經是0,因爲我將該字典分配給一個數組也是autorelease - 所以我想它是試圖釋放該dicitonary當它所在的陣列已經消失時 –