我正在一个视图的dealloc中做这个。
[baseTable release];
在头文件中,我像这样声明它:
IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;
由于某些原因,在dealloc中出现“EXC_BAD _ACCESS”错误。当我注释掉上面的行时,一切都好。我该如何确定UITableView和释放的具体情况?
我正在一个视图的dealloc中做这个。
[baseTable release];
在头文件中,我像这样声明它:
IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;
由于某些原因,在dealloc中出现“EXC_BAD _ACCESS”错误。当我注释掉上面的行时,一切都好。我该如何确定UITableView和释放的具体情况?
如果你想找出 EXC_BAD_ACCESS bug 的确切原因,启用 NSZombie,这样每当你调用任何已经解除分配的对象的方法时,它都会告诉你确切的对象和方法是什么。
启用NSZombie:
To disable it, either delete the value or uncheck it if you may want to turn it on again later. Be sure to not leave it on, because it doesn t actually deallocate anything when enabled!
我猜测你在某个地方过多释放了baseTable,请查找一下你在没有保留的情况下释放它的地方。
你必须为每个保留设置一个且仅一个发布,从那里开始,看看你怎么做。棘手的部分是确保无论你将baseTable对象传递到哪里,释放/保留都能匹配起来。所以,不幸的是,它不会像在[baseTable release]上使用grep并计算它们那么简单 :)
听起来你可能过度释放了 baseTable
。没有更多的代码就很难确定可能发生在哪里。你是否在任何时候将该表的所有权交给自动释放池?当你自动释放一个对象时,你正在将所有权转移给自动释放池,你需要确保舍弃该对象(并可能将其实例变量 nil
)。
您需要检查baseTable
的每个使用,并确保任何可能拥有该表格的对象在释放它之前保留它。还要记住,您可能会通过别名作为UITableViewDelegate
或UITableViewDataSource
方法的参数来引用表格对象。
当你使用保留属性时,需要勾选。
if(self.tableView!=nil)
{
self.tableView = nil;
}
在dealloc中,这样你可以检查表视图是否为空,如果为空,你就将其变为nil。