xcode6 beta7 prepareForSegue抛出EXC_BAD_ACCESS

时间:2014-09-05 08:17:09

标签: ios swift uistoryboardsegue xcode6-beta7

我刚刚安装了XCode6 Beta-7,现在我的一个PrepareForSegue方法看到了一个访问异常 - (当Modal Segue即将解除时调用)

有问题的代码如下:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {


    if (segue.identifier == "MY_IDENTIFIER") { //EXC_BAD_ACCESS (code=1, address=0x0)
        //Never gets here...
    }


}

我已经尝试将segue参数设置为可选项但是就Swift而言,segue不是nil,所以即使使用如下所示的检查,我也会遇到同样的错误......

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) {

    if (segue != nil) 
       if (segue!.identifier == "MY_IDENTIFIER") { //EXC_BAD_ACCESS (code=1, address=0x0)
           //Never gets here...
       }
    }


}

应用程序中的所有其他segues似乎都运行良好,但是这个是失败的 - 并且它似乎仅在发布展开的情况下发生。还有其他人遇到过吗?

编辑/解决方法

一个简单的解决方法是避免使用unwindSegue方法并简单地调用dismissViewControllerAnimated,但我仍然想知道为什么unwindSegue方法在这种情况下失败...

非常感谢!

1 个答案:

答案 0 :(得分:14)

Matt Gibson发现添加和删除segue标识符可以解决问题。

该错误的原因是默认情况下Xcode不会为展开segues添加标识符。

故事板中的默认展开segue如下所示:

<segue destination="foo" kind="unwind" unwindAction="unwind:" id="bar"/>

在Objective-C中,这不是问题,segue.identifier将是零。在Swift identifier中声明为String,这是一个非可选字符串。但是故事板中的标识符仍然是零,因此SDK返回nil,它表示它确实返回了一个非可选字符串。这会在运行时崩溃。

在故事板中更改并删除标识符后,标识符将为"",为空字符串。

<segue destination="foo" kind="unwind" identifier="" unwindAction="unwind:" id="bar"/>

这当然解决了这个问题,因为空字符串与identifier getter的指定返回值匹配。

我为此提交了radar。你应该在Apples Bug Reporter

中加入它