2011-05-13 152 views
2

初學者關於如何在使用包含一對圖像(約500K)的UIView時如何提高內存效率的問題。我猜如果我以錯誤的方式處理這個視圖並將這個視圖稱爲十次或二十次,我的應用程序將崩潰(因爲我泄漏了大約5-10 MB的RAM)。UIView和內存管理

我有我創建編程,像這樣的的UIView:

myView = [[UIView alloc] initWithFrame:0,0,0,0]; 

這個觀點我添加一些圖片,以便它吃掉的內存500K。在完成這個觀點之後,我想再次釋放內存。所以我編碼:

[myView removeFromSuperview]; 
myView = nil; 
[myView release]; 

這是要走的路嗎?我對上一次發佈的電話特別不確定。如果我從超級視圖中刪除它並將其設置爲零,myView是否已經發布?

而且,那會是一個好主意,只是在一審自動釋放MyView的,即

myView = [[[UIView alloc] initWithFrame:0,0,0,0] autorelease]; 

我會的任何建議和更正感激。

回答

4

您正在發送release消息至nil。對於這些語句的正確順序應該是:

[myView removeFromSuperview]; 
[myView release]; 

和可選之後:

myView = nil; 

有關爲什麼要設置爲nil討論:

當您將其添加爲子視圖時,超級視圖保留您的視圖,然後在刪除視圖時將其釋放。你仍然需要你釋放你的持有。分配它時可以使用autorelease,但由於您需要保留指向它的指針才能發送removeFromSuperview,因此正確的方法是在完成該指針後發送release(然後將該指針設置爲nil) 。

2

如果您在致電release之前將視圖設置爲nil,則會泄漏視圖,然後向nil發送消息。首先,你必須釋放的觀點:

[myView removeFromSuperview]; 
[myView release]; 

然後您可以將變量設置爲nil,以避免將消息發送到一個釋放的實例。

1

關於自動釋放,我認爲這只是個人喜好的問題,但我覺得它更容易跟蹤內存的問題時做:

myView = [[[UIView alloc] initWithFrame:0,0,0,0] autorelease]; 
// add myView to wherever it belongs 
..... 
[myView removeFromSuperview]; 
myView = nil; 

正如其他人所指出的那樣,前settting到myViewnil您致電release是不正確的,會泄漏內存。