第二次显示 MapKit 失败 EXC_BAD_ACCESS
Displaying MapKit for second time fails with EXC_BAD_ACCESS
我有一个问题,但很多谷歌搜索和 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
}
}
有什么提示吗?
这个问题浪费了我一天的时间。经过长时间的测试,我得出结论,这可能是 iPhone 6 plus 上 iOS 8.3 的错误。
综上所述,
我的应用崩溃时,
1) 我正在 Xcode 中调试我的 iPhone 6 plus;
2) 我构建了一个包含 UIButton 的空 UIViewController (RootVC),它的动作是推送到另一个只有 MKMapView 的 UIViewController (MapVC);
3) 所以当我点击按钮并推送到 MapVC 时,然后我通过点击导航栏上的后退按钮 return 到 RootVC。然后,当我再次点击按钮以推送到 MapVC 时,应用程序崩溃了。
但是,当我不是 运行 来自 Xcode 的应用程序时,该应用程序不会在同一设备上崩溃。例如,当我将我的应用程序上传到 Testflight 并在我的 iPhone 6 plus 上下载该应用程序时,它不会崩溃。
此外,我已经在 iPhone 5、iphone 6 和 iOS 8.4 上进行了测试。该应用程序不会崩溃。
而且我无法通过创建新项目和做同样的事情来重现问题,崩溃只发生在我现有的项目中。
所以我必须将我的 iPhone 6 plus 更新到 iOS 8.4,然后这个问题就消失了。由于它只在从 Xcode 调试时发生,我不得不冒险相信用户从应用商店下载应用程序后它不会崩溃。
我有一个问题,但很多谷歌搜索和 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
}
}
有什么提示吗?
这个问题浪费了我一天的时间。经过长时间的测试,我得出结论,这可能是 iPhone 6 plus 上 iOS 8.3 的错误。
综上所述,
我的应用崩溃时,
1) 我正在 Xcode 中调试我的 iPhone 6 plus;
2) 我构建了一个包含 UIButton 的空 UIViewController (RootVC),它的动作是推送到另一个只有 MKMapView 的 UIViewController (MapVC);
3) 所以当我点击按钮并推送到 MapVC 时,然后我通过点击导航栏上的后退按钮 return 到 RootVC。然后,当我再次点击按钮以推送到 MapVC 时,应用程序崩溃了。
但是,当我不是 运行 来自 Xcode 的应用程序时,该应用程序不会在同一设备上崩溃。例如,当我将我的应用程序上传到 Testflight 并在我的 iPhone 6 plus 上下载该应用程序时,它不会崩溃。
此外,我已经在 iPhone 5、iphone 6 和 iOS 8.4 上进行了测试。该应用程序不会崩溃。
而且我无法通过创建新项目和做同样的事情来重现问题,崩溃只发生在我现有的项目中。
所以我必须将我的 iPhone 6 plus 更新到 iOS 8.4,然后这个问题就消失了。由于它只在从 Xcode 调试时发生,我不得不冒险相信用户从应用商店下载应用程序后它不会崩溃。