我有一个问题,但很多谷歌搜索和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
}
}
任何提示?
答案 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进行调试时才会发生这种情况,所以我必须冒险相信用户从应用商店下载应用后不会崩溃。