愚蠢的记忆管理问题令我难过

时间:2011-04-13 21:32:06

标签: iphone objective-c memory-management

我有一个属性定义为:

@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中进行释放时,我收到一条“消息发送到deallocated instance”。我开始猜测自己,有人看到我做过什么愚蠢的事吗?

真的很感激这个的帮助!

5 个答案:

答案 0 :(得分:6)

您在已经release d的对象上调用autorelease。只是摆脱行

[self.settingsTableView release];

你应该好。

请注意, 应该保留dealloc方法中的版本,因为属性调用会保留,但不会释放。

答案 1 :(得分:4)

两件事。首先,您首先要过度释放表格视图:autorelease调用之后无需手动release

此外,通常,您在-dealloc中发布的内容是您在-init-initWithCoder:或其他内容中创建的内容,而不是loadView-viewDidLoad 。在这种情况下,您要查找的方法是-viewDidUnload;您只需在该方法中将self.settingsTableView设置为nil,并且属性设置器将在必要时处理它。

答案 2 :(得分: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

答案 3 :(得分:1)

似乎显而易见。你已经发布了

[self.settingsTableView release];

那么为什么要在dealloc中再次发布呢?

答案 4 :(得分:1)

我认为问题与您在分配和初始化UITableView时使用autorelease有关。

使用它后,你可能还有一个问题就是在dealloc方法中释放settingsTableView。无论何时分配/初始化对象,都应该只释放一次。

如果您使用autorelease,规则会略有不同,所以我建议您再次阅读。此外,当您将已创建的对象传递给其他东西时,他们可以通过保留对象来获取对象的完全或共享所有权,这意味着您可能需要或不需要自己释放它。该文档应该是您正在调用的方法(如addSubView)。