当卸载视图时,MapKit/Location Manager崩溃了应用程序

问题描述:

当我点击导航栏上的后退键并卸载了具有MapKit(mapView)并使用位置管理器的视图时,我的应用程序崩溃了“EXC_BAD_ACCESS”。尝试了天修复bug终于想出了一个任何人修复程序遇到这样的问题:当卸载视图时,MapKit/Location Manager崩溃了应用程序

此代码添加到您的dealloc

- (void)dealloc { 
    mapView.delegate = nil; 
    locationManager.delegate = nil; 

    [mapView release]; 
    [locationManager release]; 
} 
+0

谢谢,伙计!奇怪的是,你不能在模拟器中重现它。 – 2010-07-20 12:50:50

+0

请提供更多实施细节。它看起来像一些obj。已经发布。顺便说一句,在dealloc中委托委托是个好习惯。 – kompozer 2011-05-29 06:55:56

+0

没有看到崩溃日志不能真正告诉。但看起来你正在释放两次东西。尝试添加NSZombieEnabled,这会告诉你,如果你正在尝试访问已经释放的内存中的东西。 – CW0007007 2012-01-31 13:40:24

我有这一个了,:)而且,是,这个修复实际上是一个适当的修复;

- (void)dealloc { 
    mapView.delegate = nil; 
    locationManager.delegate = nil; 

    [mapView release]; 
    [locationManager release]; 
} 

幕后会发生什么情况是这样的:

  1. 你打的backkey。这卸载并因此释放持有mapView的控制器。由于很可能只有一个对控制器的引用,它将被释放。

  2. 但是,locationManager很可能仍然在引用的内部工作中引用。

  3. 如果locationManager和/或mapView现在向其各自的代理发出通知,它们会跟随一个无效指针。这将导致EXC_BAD_ACCESS异常。

是的:指责自己的控制代表总是一个好主意。我非常希望苹果会在那里添加一些自动化功能。