【问题标题】:object mysteriously getting deallocated对象神秘地被释放
【发布时间】:2011-01-24 06:45:19
【问题描述】:

我遇到了一个以某种方式被释放的对象的问题。我使用了各种调试技术,例如启用 NSZombie 等来查找有问题的对象。它是一个简单的 NSMutable Array 对象,我用来在分组的 tableview 中显示我的节标题。它是函数中返回标题标题的对象:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

我在上面提到的对象上使用 objectAtIndex 返回值。我确保它不会超出范围或任何东西。这个分组的 tableView 出现在我的自定义 splitView 控制器的左侧。在左侧出现弹出框的纵向模式下,一切正常。没有问题。在它以表格形式出现的景观中,我让这个对象神秘地自行释放。拆分视图首先出现没有问题。然后我有一个模态视图。正是当我在顶部关闭此模态视图时,部分标题对象会神秘地解除分配,从而使模态下方的拆分视图崩溃,该视图试图出现在模态关闭上。

任何指针或线索?

谢谢

【问题讨论】:

  • 向我们展示您的变量声明、属性、使用位置以及任何其他相关代码都会有所帮助。

标签: iphone objective-c ipad uitableview uisplitviewcontroller


【解决方案1】:

没有代码真的很难找到问题。

崩溃是发生在真实设备、模拟器还是两者上?您是手动保留/分配和释放对象还是在自动释放池中?

通常检查您的viewDidUnloadviewWillDisappeardidReceiveMemoryWarning 方法,并确保您发布的所有内容都以适当的方法重新创建。 如果您在多个视图控制器中使用该数组,请确保在每个视图控制器中的适当位置保留和释放它。

找出谁在释放数组的一种方法是:

创建 NSMutableArray 的子类

@interface myNSMutableArray : NSMutableArray {}
@end

@implementation myNSMutableArray
-(oneway void)release {
    NSLog(@"Being released");
    NSLog(@"retainCount: %i", [self retainCount]);
    [super release];
}
@end

将你的神秘数组的类型更改为myNSMutableArray,在 2 NSLog 行之后添加一个断点,当调试器到达断点时,向 GDB 请求回溯(bt 命令)。

【讨论】:

  • 感谢您的所有意见。代码方面,除了它是在接口中声明并在 tableView 的 viewDidLoad 中初始化的 NSMutable 数组之外,没有什么要发布的。我到处检查并确保我不会释放它。我什至尝试手动保留它。没用。在模拟器上崩溃。而这个 tableView 是唯一使用这个对象的控制器。我已经尝试了通常的 alloc-init 和 alloc-initWithArray 并确保我根本不释放它并手动保留它。希望对您有所帮助。
  • 我更新了我的答案以包含一个调试选项,试试吧。崩溃的回溯可能也很有用。如果 release 永远不会被调用,考虑对dealloc + NSLog(@"retain count %i", retainCount);做同样的事情
  • 谢谢!您的意见有所帮助。虽然没有解释为什么。但是我在提到细节时犯了一个错误。该数组未在接口中声明。这是一个全球性的实施。将其更改为接口变量并手动保留它。工作。回溯 NSLog 确实帮助我意识到它是一个全局的实现,尽管保留,但它的内存以某种方式突然被释放。唯一的区别是我将声明移至接口并使其成为类变量以使其工作。
  • 这是一个很好的蛮力调试技术,但提到retainCount是无稽之谈。尤其是在dealloc 的上下文中。如果是虚假的dealloc,则使用子类并在dealloc 上设置断点。如果是过度发布,Instruments 将是比这更好的选择,但这也有效——不需要retainCount
  • @bbum 我同意在大多数情况下有一种更简单的方法可以找到问题。然而,由于提问者没有提供任何代码,这是我能想到的第一件事。我没怎么用过 Instruments。虽然您对dealloc 的看法是正确的,但我只是认为它不会受到伤害。我还将retainCount 更正为[self retainCount]
【解决方案2】:

当您加载(或重新加载)您的数组时,您是否保留了它?

【讨论】: