【问题标题】:dismissViewControllerAnimated:completion: causing memory crashdismissViewControllerAnimated:completion: 导致内存崩溃
【发布时间】:2014-07-16 21:47:10
【问题描述】:

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

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

代码在我的故事板中触发“Present Modally”(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 系统本身中。

【问题讨论】:

  • 能否在崩溃时添加堆栈跟踪?

标签: ios swift autolayout ios8


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-22
      • 2016-02-21
      • 1970-01-01
      • 2018-04-10
      • 2012-12-17
      • 2016-04-06
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多