为什么UITableView会在dealloc中崩溃应用程序?

时间:2009-03-13 03:50:01

标签: iphone cocoa-touch uitableview

我在dealloc of a view中执行此操作

[baseTable release];

在头文件中,我声明如下:

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

出于某种原因,我在dealloc中得到了“EXC_BAD _ACCESS”。当我评论出上述内容时,一切都很顺利。如何确定UITableView和发布的具体内容?

4 个答案:

答案 0 :(得分:4)

如果您想了解EXC_BAD_ACCESS错误的确切原因,请启用NSZombie,这样每当您在解除分配的对象上调用任何方法时,它都会准确地告诉您哪个对象及其方法。

启用NSZombie:

  1. 展开左侧“组和文件”窗口中的“可执行文件”部分。
  2. 打开可执行文件的属性。
  3. 找到“参数”部分(它位于屏幕的下半部分,我忘记它所在的选项卡)
  4. 使用值“YES”
  5. 添加新参数“NSZombieEnabled”

    要禁用它,请删除该值,或者如果您希望稍后再将其取消,请取消选中该值。一定要不要打开它,因为它在启用时实际上并没有解除分配!

答案 1 :(得分:1)

我的猜测是你在某个地方发布过多次baseTable,看看你发布它的地方没有保留。

每个保留必须有一个且只有一个版本,从那里开始,看看你如何去。棘手的一点就是确保无论你在哪里传递baseTable对象,释放/保持匹配。所以它不会像[baseTable release]上的grep那么简单并且不幸地计算它们:)

答案 2 :(得分:1)

听起来你过度释放baseTable。如果没有看到更多的代码,很难说可能会发生什么。您是否在任何时候将该表的所有权授予自动释放池?当您自动释放对象时,您将所有权转移到自动释放池,并且您需要确保放弃该对象(并且可能nil输出其实例变量。

您需要检查baseTable的每次使用,并确保任何可能拥有该表所有权的对象在释放之前保留它。另请记住,您可能通过别名作为UITableViewDelegateUITableViewDataSource方法的参数来引用表对象。

答案 3 :(得分:-1)

当您使用属性时保留检查是否

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

在dealloc中。通过这种方式,您将检查表视图是否为nil,并且它是nil,您将其设置为nil。