English 中文(简体)
为什么UITableView在dealloc时会导致应用程序崩溃?
原标题:
  • 时间:2009-03-13 03:50:00
  •  标签:

我正在一个视图的dealloc中做这个。

[baseTable release];

在头文件中,我像这样声明它:

IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;

由于某些原因,在dealloc中出现“EXC_BAD _ACCESS”错误。当我注释掉上面的行时,一切都好。我该如何确定UITableView和释放的具体情况?

问题回答

如果你想找出 EXC_BAD_ACCESS bug 的确切原因,启用 NSZombie,这样每当你调用任何已经解除分配的对象的方法时,它都会告诉你确切的对象和方法是什么。

启用NSZombie:

  1. Expand the Executables section in the "Groups and Files" window on the left.
  2. Open the properties of the executable.
  3. Find the "Arguments" section (It s on the bottom half of the screen, I forget what tab it s in)
  4. Add a new argument "NSZombieEnabled" with value "YES"

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的每个使用,并确保任何可能拥有该表格的对象在释放它之前保留它。还要记住,您可能会通过别名作为UITableViewDelegateUITableViewDataSource方法的参数来引用表格对象。

当你使用保留属性时,需要勾选。

if(self.tableView!=nil)
{
self.tableView = nil;
}

在dealloc中,这样你可以检查表视图是否为空,如果为空,你就将其变为nil。





相关问题
热门标签