2011-04-13 20 views
0

我有一個屬性定義爲:有傻內存管理問題,我難倒

@property(nonatomic, retain) UITableView *settingsTableView; 

然後在我的viewDidLoad中方法,我有:

self.settingsTableView = [[[UITableView alloc] initWithFrame:tableFrame style:UITableViewStyleGrouped] autorelease]; 
[self.view addSubview:self.settingsTableView]; 
[self.settingsTableView release]; 

然後在的的dealloc方法視圖控制器我有:

[settingsTableView release]; 

當我嘗試從dealloc中釋放時,我收到了「發送到釋放實例的消息」。我開始第二次猜測自己,有人在我所做的事情上看到了什麼愚蠢的行爲?

真的很感謝這個幫助!

+0

順便說一下>沒有涉及到Interface Builder。 – Damien 2011-04-13 21:33:50

+0

我建議你閱讀[this](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html),這是一本很好的指南,它解釋了autorelease是什麼,何時使用它,爲什麼你需要它等等。如果你有C或C++的背景,不要被名字所迷惑,Objective-C – 2011-04-13 21:46:56

+0

中的東西稍有不同。謝謝你們所有的幫助。我被這個http://blog.thepete.net/2010/10/common-objective-c-memory-management.html – Damien 2011-04-13 22:11:03

回答

6

你的對象上調用release你已經autorelease d。剛剛擺脫線

[self.settingsTableView release]; 

你應該是好的。

請注意,你應該將版本保留在dealloc方法中,因爲屬性調用會保留給你,但不會釋放。

1

似乎很明顯。你已經發布了

[self.settingsTableView release]; 

那麼爲什麼在dealloc中再次釋放它呢?

2

以下是您需要進行的更改。

self.settingsTableView = [[[UITableView alloc] initWithFrame:tableFrame style:UITableViewStyleGrouped] autorelease]; 
[self.view addSubview:self.settingsTableView]; 
[self.settingsTableView release]; 
//^^^ This line is bad no need to release this value until dealloc 
//if it is defined as retain or copy 
+0

他是否應該從第一行的末尾刪除「autorelease」? – 2011-04-13 21:40:57

+0

謝謝Joe,我現在明白了。 *光*已經開始了。 – Damien 2011-04-13 22:16:18

1

我相信這個問題與您在使用autorelease時分配和初始化UITableView有關。

你也可能在使用它之後釋放settingsTableView,而在dealloc方法中有問題。任何時候你分配/初始化一個對象,你只應該釋放一次。

如果你使用autorelease,規則有點不同,所以我建議再讀一遍。此外,當您將創建的對象傳遞給其他事物時,它們可能會通過保留對象來完全或共享所有權,這意味着您可能需要也可能不需要再次釋放它。該文檔應該是你打電話的方法(如addSubView)。

4

兩件事。首先,您首先過度釋放表格視圖:autorelease調用之後不再需要手動release

而且,在一般情況下,你在-dealloc釋放什麼是你在-init-initWithCoder:創建,或什麼的,不loadView-viewDidLoad的事情。在這種情況下,您正在尋找的方法是-viewDidUnload;您只需在該方法中將self.settingsTableView設置爲nil,並且屬性設置器將在必要時處理釋放它。