从Interface Builder实例化的Zombie Objects From Views

Rya*_*fer 7 memory-management objective-c interface-builder ios

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

我已经设置了我的nib文件,以便与Apple在其中一个示例项目中完全匹配.

在此输入图像描述

我也花时间用NSZombieEnabled和使用Instruments来分析它.但是,为什么会发生这种情况,我仍然无法做出正面或反面.这是保留/释放的配对....

在此输入图像描述

并且在创建UIView对象时暴露堆栈跟踪.

在此输入图像描述

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

Nil*_*ehn 1

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

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

通知:

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

对于 KVO,请使用方法和您的键路径

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
Run Code Online (Sandbox Code Playgroud)

干杯,尼尔斯