dismissViewControllerAnimated:completion:导致内存崩溃

时间:2014-07-16 21:47:10

标签: ios swift autolayout ios8

所以我正在开发一个应用程序,如果我没有在应用程序默认值中存储用户名,我会从基本视图启动登录视图。

let defaults = NSUserDefaults.standardUserDefaults()
if !defaults.objectForKey("username") {
    dispatch_async(dispatch_get_main_queue(), {
        self.navigationController.tabBarController.performSegueWithIdentifier("Login", sender: self)
    })
}

代码在我的故事板中触发了一个“现在模态”(iOS 8)segue,它提供了一个带有默认动画的表单。

它创建的视图具有使用AutoLayout排列的各种子视图。

现在,稍后在我的代码中(在检查登录有效并更新默认值时)我会关闭登录视图。

defaults.setObject(signInData["username"], forKey: "username")
defaults.setObject(signInData["password"], forKey: "password")
defaults.synchronize()
dispatch_async(dispatch_get_main_queue(), {
    self.dismissViewControllerAnimated(true, completion: nil)
})

在这里,我在应用程序中崩溃了。具体来说,错误消息(当启用僵尸对象时)是

-[_UILayoutGuide superview]: message sent to deallocated instance 0x7fb3cc93bdb0

其中UILayoutGuide显然与AutoLayout相关。

现在看来我的视图在被解雇后被取消分配,但是有一个指向它的指针,尽管如此。我不知道如何修复它,因为它不是我编写的任何代码(我认为),而是在AutoLayout系统本身。

2 个答案:

答案 0 :(得分:0)

_UILayoutGuide是对象的类,0x7fb3cc93bdb0是对象的旧RAM位置(现在是僵尸对象的位置。)“superview”是发送给僵尸的消息。

自从您在Beta-2发布之前发布,其中一个更新是否解决了您的问题?

答案 1 :(得分:-1)

我遇到了这个问题,我的应用程序崩溃了,因为在弹出(或解除)视图控制器之后,某些视图约束仍处于活动状态,以下是错误代码。经过调试一段时间后,我发现视图约束被绑定到Bottom或Top View Layouts,这是崩溃的主要原因,所以我将该约束(从布局视图更改为Parent View)更改为父视图查看快照。 enter image description here

  

由于未捕获的异常终止应用程序' NSGenericException',原因:'无法在视图上安装约束。约束是否引用了视图子树之外的内容?这是非法的。约束:查看:>'