dismissViewControllerAnimated:completion: 导致内存崩溃

3

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

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系统自身中。


1
请问您能否在崩溃时添加一个堆栈跟踪吗? - Guillaume Algis
2个回答

0

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

由于您在Beta-2发布之前发布了帖子,那么更新中是否修复了您的问题呢?


-1

我遇到了这个问题,我的应用程序崩溃了,因为在弹出(或解除)视图控制器后,一些视图的约束仍然处于活动状态,以下是错误代码。经过一段时间的调试,我发现视图约束紧贴底部或顶部视图布局,这是崩溃的主要原因,所以我已将该约束(从布局视图到父视图)更改为父视图,请参见快照。 enter image description here

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接