我有一个MKMapView.有时在我的视图控制器被解雇后,我会得到一个EXC_BAD_ACCESS.
我打开了NSSZombies,它看起来像是MKMapView代表 - 我的视图控制器!- 正在被调用,尽管释放了子类MKMapView和UIViewController子类.我已经检查了,我的记忆管理是正确的.
这是怎么回事?
我有一个带有调用的MKMapView的视图控制器
[self.mapView setRegion:region animated:YES];
Run Code Online (Sandbox Code Playgroud)
将地图从A重新定位到B.
保存MKMapView的视图控制器被设置为委托和in
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)
我有一些代码会触发另一个setRegion:animated:到MKMapView,以便地图自动放大新位置.
如果我popViewControllerAnimated,一切正常:视图控制器在MKMapView动画完成平移和缩放之后.
但是,当我尝试popViewControllerAnimated时:当前视图控制器在MKMapView运行它的动画时,应用程序崩溃,"消息发送到解除分配的实例".
从调试器的外观来看,我认为MKMapView正试图从弹出和释放的委托中调用一个方法.
所以我试过了
[self.mapView setDelegate:nil];
self.mapView = nil;
Run Code Online (Sandbox Code Playgroud)
在viewDidUnload中没有运气.该应用程序仍然一直崩溃.
我能想到的唯一的事情是创建一个单独的新的委托类和保留从父视图控制器类,以便将的MKMapView有一个代表包含它的视图控制器被释放后还要打电话.
为什么会这样?还有其他"干净"的选择吗?