【问题标题】:Why does UITableView crash app in dealloc?为什么 UITableView 在 dealloc 中崩溃应用程序?
【发布时间】:2009-03-13 03:50:00
【问题描述】:
我在视图的 dealloc 中这样做
[baseTable release];
在头文件中,我这样声明:
IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;
由于某种原因,我在 dealloc 中得到了“EXC_BAD _ACCESS”。当我注释掉上面的行时,一切都很好。如何确定 UITableView 和发布的具体情况?
【问题讨论】:
标签:
iphone
cocoa-touch
uitableview
【解决方案1】:
如果您想找出 EXC_BAD_ACCESS 错误的确切原因,请启用 NSZombie,这样无论何时您调用已释放对象的任何方法,它都会准确地告诉您它是什么对象以及它是什么方法。
启用 NSZombie:
- 在左侧的“组和文件”窗口中展开“可执行文件”部分。
- 打开可执行文件的属性。
- 找到“参数”部分(它在屏幕的下半部分,我忘记了它在哪个选项卡中)
- 添加一个值为“YES”的新参数“NSZombieEnabled”
要禁用它,请删除该值或取消选中它(如果您想稍后再次打开它)。一定不要让它打开,因为它在启用时实际上并没有释放任何东西!
【解决方案2】:
我的猜测是您在某个地方发布了太多次 baseTable,请寻找一个您在没有保留的情况下发布它的地方。
每次保留都必须有一个且只有一个版本,从那里开始,看看你是怎么做的。棘手的一点是确保无论您传递 baseTable 对象,释放/保留都匹配。所以它不会像 [baseTable release] 上的 grep 那样简单并不幸地计算它们:)
【解决方案3】:
听起来你过度释放baseTable。如果不查看更多代码,很难说这可能发生在哪里。您是否随时将该表的所有权授予自动释放池?当您自动释放一个对象时,您将所有权转移到自动释放池,您需要确保放弃该对象(并且可能将nil 放弃其实例变量)。
您需要检查baseTable 的每次使用,并确保任何可能承担表所有权的对象在释放它之前保留它。另请记住,您可能通过别名将表对象作为UITableViewDelegate 或UITableViewDataSource 方法的参数引用。
【解决方案4】:
当你使用 Retain 属性时,检查是否
if(self.tableView!=nil)
{
self.tableView = nil;
}
在 dealloc 中。通过这种方式,您正在检查表视图是否为 nil,并且您正在将其变为 nil。