0

免责声明:我对 Objective-C 和保留模型还很陌生。在过去的五年里,我一直在垃圾收集的 .NET 环境中进行开发,所以我被宠坏了。我还在学习。

我的 iPhone 应用程序因 EXC_BAD_ACCESS 而崩溃。它发生在导航控制器/表格视图设置中。当我第一次选择一行时,没有问题。它可以毫无问题地切换到子控制器。我返回并再次选择同一行。然后程序继续崩溃。每隔一行都可以正常工作,但是每第二次访问一行时,它就会崩溃。

我已经确定了发生这种情况的位置。正在切换到的子控制器(这是我为同一类型的每一行重用的类)具有一个 NSString 数组,表示将显示的行。我在推动子视图控制器之前设置它。它就在那里显然发生了这种情况。

我很难调试这个问题,仍然在与 xcode 和所有东西搏斗。我担心这里可能缺少一些重要信息,但也许你知道一些东西。

4

2 回答 2

2

启用 NSZombies。

http://www.cocoadev.com/index.pl?NSZombieEnabled

这将帮助您识别被过度释放的对象(可能发生了什么)。

于 2010-03-24T21:39:22.697 回答
0

所以... [UINavigationController pushViewController] 不保留,是吗?;) 我所做的是初始化/分配将被推送到导航堆栈上的控制器,推送它然后释放它。我认为导航控制器会保留控制器。显然,它没有。它显然在第一次被推动时起作用,但不是第二次。我想这就是内存真正被释放的地方。启用僵尸表明它正在将消息(来自设置器)发送到已释放的对象。

为什么我认为 pushViewController 会保留控制器?我不知道; 我想我很困惑,如果你分配它,你也有责任释放它。我莫名其妙地认为,在推动它之后,这将是导航控制器的责任。看来我错了。

我仍在学习感受这一点(邪恶的 C# 和垃圾收集让我大吃一惊!)。有人有什么要补充的吗?

为了说明,这似乎是错误的:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSUInteger section = [indexPath section];
 NSUInteger row = [indexPath row];

 if (selectionController == nil)
 {
  selectionController =
   [[ConfigSelectionViewController alloc] initWithStyle:UITableViewStyleGrouped];
 }

 NSString *title = [self titleForSection:section row:row];
 NSString *key = [self keyForSection:section row:row];

 selectionController.configKey = key;
 selectionController.title = title;

 NSArray *listItems = [self itemsForSection:section row:row];
 selectionController.list = listItems;

 [self.navigationController pushViewController:selectionController animated:YES];

        // DON'T DO THIS!
        [selectionController release];


}
于 2010-03-29T21:08:54.053 回答