我有一个属性定义为:
@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”。我开始猜测自己,有人看到我做过什么愚蠢的事吗?
真的很感激这个的帮助!
答案 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
)。