编辑:更改了标题。我当时不知道,但这是重复的如果我不再使用 MKMapView,为什么在释放它后我会崩溃? https://stackoverflow.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it
这个问题类似于为什么使用 ARC + NSZombieEnabled 时对象未释放 https://stackoverflow.com/questions/8408071/why-is-object-not-dealloced-when-using-arc-nszombieenabled但足够不同,我认为值得把它扔在那里,以防有人理解并向我解释正在发生的事情。另一个问题可能是 XCode bug,所以我认为这可能是类似的。
设想:
-
RootViewController
has a tableView
显示一堆项目
- 选择一个单元格会呈现一个模式
detailViewController
包含另一个tableView
- 中的表格单元格之一
detailViewController
包含一个MKMapView
显示该项目的位置
mapView.delegate = detailViewController
- 关闭模式
detailViewController
此后不久,应用程序崩溃了MKMapView
sends mapView:viewForAnnotation:
到现在已释放的detailViewController
。此崩溃在具有临时发行版本的用户设备上重现,因此该问题与NSZombieEnabled
.
我能够通过添加以下内容来解决崩溃问题:
_mapView.delegate = nil;
to the dealloc
的方法tableViewCell
包含地图视图。
问题:为什么在释放单元格时需要将委托清零?似乎是mapView
当单元被解除分配时,应该由 ARC 解除分配,而无需这样做。零代表是一个很好的做法,但我认为在这种情况下不需要这样做。
编辑:两者的所有子视图detailViewController
和UITableViewCells
被声明为(nonatomic, strong)
属性阿拉:
@property (nonatomic, strong) MKMapView * mapView;
编辑2:我想我需要更好地阅读文档。 @fluchtpunkt 是正确的。以下是来自的相关信息MKMapView
文档:
在释放已设置了 MKMapView 对象之前
delegate,记住将该对象的 delegate 属性设置为 nil。一
您可以执行此操作的地方是在您处置的 dealloc 方法中
地图视图。