【问题标题】: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:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2012-07-10
            • 1970-01-01
            • 1970-01-01
            • 2018-04-03
            • 1970-01-01
            • 2012-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多