2014-07-16 138 views
3

因此,我正在开发一个应用程序,并且如果我没有在应用程序默认值中存储用户名,则从基本视图启动登录视图。dismissViewControllerAnimated:completion:导致内存崩溃

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

代码触发一个“当前的模态”(的iOS 8)赛格瑞在我的故事板呈现与默认的动画形式表。

它创建的视图具有使用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

您可以在崩溃时添加堆栈跟踪吗? –

回答

0

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

由于您在发布Beta-2之前发布了一个更新,因此解决了您的问题吗?

-1

我遇到了这个问题,我的应用程序崩溃了,因为一些视图的约束在弹出(或关闭)视图控制器后仍然有效,以下是错误代码。调试一段时间后,我发现视图约束被拥抱到底视图或顶视图布局,这是崩溃的主要原因,所以我已经将该约束(从布局视图更改为父视图)更改为父视图查看快照。 enter image description here

由于未捕获的异常'NSGenericException'而终止应用,原因:'无法在视图上安装约束。约束是否从视图的子树之外引用了某些东西?这是违法的。约束:查看:>'