1

我在视图的 dealloc 中这样做

[baseTable release];

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

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

出于某种原因,我在 dealloc 中得到一个“EXC_BAD _ACCESS”。当我注释掉上面的行时,一切都很好。如何确定 UITableView 和发布的具体情况?

4

4 回答 4

4

如果您想找出 EXC_BAD_ACCESS 错误的确切原因,请启用 NSZombie,这样无论何时您调用已释放对象的任何方法,它都会准确地告诉您它是什么对象以及它是什么方法。

要启用 NSZombie:

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

要禁用它,请删除该值或取消选中它,如果您想稍后再次打开它。一定不要让它打开,因为它在启用时实际上并没有释放任何东西!

于 2009-03-21T18:31:20.703 回答
1

我的猜测是您在某个地方发布了太多次 baseTable,请寻找一个您在没有保留的情况下发布它的地方。

每次保留都必须有一个且只有一个版本,从那里开始,看看你是怎么做的。棘手的一点是确保无论您传递 baseTable 对象,释放/保留都匹配。因此,它不会像 [baseTable release] 上的 grep 那样简单,不幸的是:)

于 2009-03-13T04:28:49.397 回答
1

听起来你过度释放了baseTable。如果不查看更多代码,很难说这可能发生在哪里。您是否随时将该表的所有权授予自动释放池?当您自动释放一个对象时,您将所有权转移到自动释放池,您需要确保放弃该对象(并可能nil放弃它的实例变量)。

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

于 2009-03-13T04:34:33.907 回答
-1

当您使用 Retain 属性时,请检查是否

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

在 dealloc.In 这种方式中,您正在检查表视图是否为 nil,并且您正在将其变为 nil。

于 2012-10-29T04:17:49.727 回答