【发布时间】:2012-01-24 00:48:54
【问题描述】:
编辑:更改了标题。我当时不知道,但这是Why am I crashing after MKMapView is freed if I'm no longer using it?的复制品
这个问题与Why is object not dealloc'ed when using ARC + NSZombieEnabled 相似,但又足够不同,我认为值得把它扔在那里,以防有人理解并可以向我解释正在发生的事情。另一个问题可能是 XCode 错误,所以我认为这可能是相似的。
场景:
-
RootViewController有一个tableView显示一堆项目 - 选择一个单元格会显示一个模态
detailViewController,其中包含另一个tableView -
detailViewController中的一个表格单元格包含一个MKMapView,显示项目的位置 mapView.delegate = detailViewController- 关闭模态
detailViewController
此后不久,应用程序崩溃 b/c,MKMapView 将 mapView:viewForAnnotation: 发送到现在已解除锁定的 detailViewController。此崩溃在具有临时分发版本的用户设备上重现,因此该问题与 NSZombieEnabled 无关。
我能够通过添加以下内容来解决崩溃:
_mapView.delegate = nil;
到包含 mapView 的 tableViewCell 的 dealloc 方法。
问题:为什么在释放单元格时需要将委托归零?当单元被解除分配时,似乎mapView 应该由 ARC 解除分配,而这是不必要的。 nil 代表是一种很好的做法,但我认为在这种情况下不需要这样做。
编辑:detailViewController 和UITableViewCells 的所有子视图都声明为(nonatomic, strong) 属性ala:
@property (nonatomic, strong) MKMapView * mapView;
编辑 2:我想我需要更好地阅读文档。 @fluchtpunkt 是正确的。以下是来自MKMapView 文档的相关信息:
在释放您设置了一个 MKMapView 对象之前 委托,记得将该对象的委托属性设置为 nil。一 你可以这样做的地方是你处理的 dealloc 方法 地图视图。
【问题讨论】:
-
您能否为您的
detailViewController发布@strong/@weak 属性声明,尤其是MKMapView? -
完成。我没有 @weak 属性,因为该应用程序针对 iOS 4.3+。 mapView 在自定义
UITableViewCell中作为强属性。 -
听起来和 pre-ARC 一样,正如我在这里描述的:stackoverflow.com/questions/2188098/…
-
是的,是的。与 ARC 完全无关,只是我不知道的 MKMapView 的要求。希望我在发布之前看到你的问题。没有什么比(误)读文档更能让你不时谦虚的了。
标签: objective-c ios xcode4.2 automatic-ref-counting