7

我在我们的应用程序的关键点发生了崩溃。但是,崩溃似乎来自过度释放的 UIView 对象(更具体地说,是 UITableView 的标题视图,在本例中是 UISearch 栏)。奇怪的是,它是从一个 nib 文件实例化的。这里是崩溃...

我已经设置了我的 nib 文件以完全匹配 Apple 在其示例项目之一中的内容。

在此处输入图像描述

我还花时间使用 NSZombieEnabled 和 Instruments 来分析这个问题。但是,我仍然无法确定为什么会发生这种情况。这是保留/释放的配对....

在此处输入图像描述

以及创建 UIView 对象时暴露的堆栈跟踪。

在此处输入图像描述

此类错误的常见示例是 NSError 对象,该对象被创建并分配给 autorelease 块中的 out 参数。但是,我不希望在 UIView 上看到同样的问题。我也没有在我的代码中的任何地方看到自动释放块(保存在主运行循环中)。关于如何解决这个问题的任何想法?

4

2 回答 2

1

问题是,监听通知或添加 KVO 观察者不会改变观察对象的保留计数。在释放您的视图/视图控制器/对象后,似乎立即触发了通知。

您可以更改- (void)dealloc方法以从您的视图/视图控制器中删除通知/KVO 观察者

通知:

-(void) dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    //if you are not using ARC you also have to write
    //[super dealloc];
}

对于 KVO 使用 Method 和你的 keypath(s)

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath

干杯,尼尔斯

于 2013-11-06T18:47:57.153 回答
0

我没有太多信息,但让我分享一些想法:

  • KVO 是异步接收数据的糟糕模式,因为正如@Niels 所说,它不会改变观察对象的保留计数
  • 最好的办法是安全地将委托返回到拥有表视图或任何其他需要异步更新数据的视图的控制器。
  • 始终照顾委托控制器,防止它们在你想要它之前自动释放,ti,在接收所有异步数据之前,通过将弹出控制器添加到集合属性等......这一切都取决于你的应用程序如何导航以及你想要的方式它发挥作用
  • 当然,您也可以使用 UINavigationControllerDelegate 在控制器委托被解除时取消异步传输操作。
于 2013-11-05T08:16:45.753 回答