使用EXC_BAD_ACCESS第二次显示MapKit失败

时间:2015-07-20 20:29:14

标签: ios swift mapkit

我有一个问题,但很多谷歌搜索和SO帖子没有帮助。在我的iOS swift应用程序中,我有一个带有两个选项卡的标签栏控制器。当用户单击第二个选项卡时,应用程序切换到第二个屏幕以创建事件。用户可以自由地在两个标签之间切换。在用于创建事件的第二个选项卡上,用户可以为事件添加多个候选位置。用户能够添加位置的方式应该是通过地图我使用MapKit。我使用push segue将用户发送到一个新的UIViewController,里面有一个地图。当用户单击添加位置按钮时,地图会正确显示(目前我没有做任何与地图交互的逻辑)。我的问题是,如果用户点击后退按钮(关闭地图屏幕)并再次尝试添加位置,UIViewController将显示一个灰色地图,应用程序将挂在该行:

class AppDelegate: UIResponder, UIApplicationDelegate {

,错误信息为:

 Thread 1: EXC_BAD_ACCESS (code=1, address=0x103c)
 #0 0x00699440 in EAGLContext_renderbufferStorageFromDrawable(EAGLContext*, objc_selector*, unsigned int, id<EAGLDrawable>) ()

我知道有很多SO帖子谈到了内存问题,例如SO post,我确实尝试了他们的解决方案,但没有帮助。

这是我的UIViewController非常简单的代码,用于显示地图:

import UIKit
import MapKit
import ObjectMapper
import CoreLocation


class AddRestaurantViewController: UIViewController{


@IBOutlet weak var theMapView: MKMapView!


override func viewDidLoad() {
    super.viewDidLoad();
    println("viewDidLoad")

}

override func viewWillAppear(animated: Bool) {
    println("viewWillAppear")
}

override func viewWillDisappear(animated: Bool) {
    println("viewWillDisappear")
}

override func viewDidDisappear(animated: Bool) {
    self.purgeMapMemory()
}

func purgeMapMemory(){
    println("Now purging...")
    self.theMapView.mapType = MKMapType.Standard
    self.theMapView.removeFromSuperview()
    self.theMapView = nil
}

}

任何提示?

1 个答案:

答案 0 :(得分:2)

这个问题浪费了我生命中的一天。经过大量的测试,我得出结论,这可能是iPhone 6 plus上的iOS 8.3的错误。

总而言之,

我的应用程序崩溃了,

1)我在iPhone 6 plus上的Xcode中进行调试;

2)我组成了一个包含UIButton的空UIViewController(RootVC),其动作是推送到另一个只有MKMapView的UIViewController(MapVC);

3)所以当我点击按钮并推送到MapVC时,我会通过点击navigationBar上的后退按钮返回RootVC。然后当我再次点击按钮进入MapVC时,应用程序崩溃了。

但是,当我没有从Xcode运行应用程序时,该应用程序不会在同一设备上崩溃。例如,当我将我的应用程序上传到Testflight并在我的iPhone 6 plus上下载应用程序时,它不会崩溃。

另外,我已经在iPhone 5,iphone 6上测试了iOS 8.4。该应用程序不会崩溃。

我无法通过创建新项目来重现问题并执行相同的操作,崩溃只发生在我现有的项目中。

所以我必须将我的iPhone 6 plus更新到iOS 8.4,然后这个问题就消失了。因为只有在从Xcode进行调试时才会发生这种情况,所以我必须冒险相信用户从应用商店下载应用后不会崩溃。