2012-02-26 139 views
0

我正在優化我的應用程序並確保內存管理得到正確實施。因爲我發現didUnload/dealloc/willAppear對於實現內存清理並不可靠,所以我決定實現我自己的方法,這樣我就可以完全控制這個內存管理。在頭文件即使我明確釋放內存,內存也不會釋放

@property (retain) NSMutableArray *selectedCardIDs; 
@property (retain) NSMutableArray *selectedRowArray; 
@property (retain) NSMutableArray *cardArray; 
@property (retain) NSMutableArray *cardIDArray; 

這裏釋放方法我陣列

定義:

- (void) willReleaseObjects { 
[self.aCopyOfCardIDArray release]; 
[self.listOfItems release]; 
[self.aCopyListOfItems release]; 
[self.selectedCardIDs release]; 
[self.selectedRowArray release]; 
[self.cardArray release]; 
[self.cardIDArray release]; 

}

該陣列可以得到非常大(> 1000多個條目中的每個) ,爲什麼在卸載視圖後這些數組的發佈是必不可少的。我明確地調用這個函數在IBAction爲方法,如:

- (IBAction) stopDictionary:(UIBarButtonItem *) sender { 
[self closeDatabase]; 
[self willReleaseObjects]; 
[self dismissModalViewControllerAnimated:YES]; 

}

我調試的代碼,它實際上是執行每一個版本,但是當我診斷與儀器的內存分配,它似乎釋放只有部分內存,實際上幾乎沒有什麼爲什麼每次我再次加載這個視圖時,內存消耗當然在增加,這根本不好。 任何想法,爲什麼我的記憶不在這裏發佈?謝謝。

回答

1

如果您將任何屬性聲明爲分配或複製,請不要在屬性上調用發佈,因爲您有風險發生非常糟糕的情況。您可能會釋放已經自動發佈的返回實例。

而是釋放它後面的實例變量或將屬性設置爲零。無論哪種方式,你會達到正確的結果。如果你有你的屬性的任何鍵/值觀察員最好的辦法是設置屬性爲nil,將值自動傳播到任何觀察員:

- (void) willReleaseObjects { 
    self.aCopyOfCardIDArray = nil; 
    self.listOfItems = nil; 
    ... 
} 
+0

感謝聖誕老人,我試過了,同樣的結果。我在我的問題中添加了屬性定義,並且如您所見,我保留所有這些屬性。據我所知,所有分配的對象應該使用release來發布。至少這是我迄今爲止關於內存管理所讀到的內容。我有一種印象,那就是在我返回到前一個視圖後,整個viewController的內容不會被銷燬。 – renesteg 2012-02-26 13:55:50

+0

您可能需要檢查您訪問這些屬性的任何其他地方,並確保您沒有額外的保留位置。另外請確保在創建屬性時不要泄漏它。例如。這會導致泄漏:self.property = [[AClass alloc] init];無論如何,我描述的方法不會導致泄漏。 – 2012-02-26 14:08:26

+0

已解決。忘記了alloc的autorelease。對象現在正在被釋放,當他們應該。但是我意識到了另外一種奇怪的行爲:當我開始我的主視圖時,一看到約400個分配對象,只要顯示視圖,儀器中的分配計數器突然增加到6,000多。可能是正常的,所以如果沒有什麼可以解決的話,不要再開始追逐幽靈。 想法?有沒有可用於這種事情的基準? Wuld理解這一點非常有幫助,因爲視圖本身當然也會創建對象本身。謝謝。 – renesteg 2012-02-26 15:33:59