2011-04-13 19 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,并且属性设置器将在必要时处理释放它。