xcode6 beta7 prepareForSegue 抛出 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】xcode6 beta7 prepareForSegue 抛出 EXC_BAD_ACCESS【英文标题】:xcode6 beta7 prepareForSegue throws EXC_BAD_ACCESS 【发布时间】:2014-09-05 08:17:09 【问题描述】:

我刚刚安装了 XCode6 Beta-7,现在我的一个 PrepareForSegue 方法出现访问异常 - (当模态 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 似乎都可以正常工作,但是这个失败了 - 它似乎仅在发出 unwind 的情况下发生。其他人遇到过这个吗?

编辑/解决方法

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

非常感谢!

【问题讨论】:

想一想:升级到 Beta 7 后您是否清理了构建文件夹? 嗯.. 清洁也没有运气。 (不过提醒一下 - 这也让我发现了一些过去的测试版 :)) 我在使用 segue 时遇到了类似的问题。试试这个:对于 Interface Builder 中你得到的每个 没有 标识符的 segue,输入一些东西,删除它,然后点击返回。然后重建并重试。我在之前的测试版中添加了一个没有标识符的 segue,这就是导致问题的原因。通过在最新的 Xcode 中强制将其重新设置为无标识符 again,我想我在 xib 中更改了一些需要与最新 beta 中的某些运行时代码完全匹配的内容。 谢谢@MattGibson - 尝试了你的建议,但仍然没有运气......我会尝试用一个测试项目重新创建问题,看看是否能解决它。 我在 Xcode 6 GM 版本中仍然看到同样的问题 - @MattGibson 你的方法似乎对我有用! 【参考方案1】:

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

这个bug的原因是Xcode默认没有为展开segues添加标识符。

情节提要中的默认展开转场如下所示:

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

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

一旦您更改并删除了故事板中的标识符,该标识符将是 "",一个空字符串。

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

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

我为此提交了radar。你应该在Apples Bug Reporter中欺骗它

【讨论】:

酷,很高兴我指出了正确的方向。感谢您深入了解幕后发生的事情。 补充一点,我使用的 segue 不是问题,因为它定义了一个标识符。我的问题是情节提要中的另一个 segue 没有标识符。

以上是关于xcode6 beta7 prepareForSegue 抛出 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

Xcode5.1.1 and Xcode6 beta7 iOS7.1 64-bit [Allocator] Allocator invalid, fall back to malloc

Swift beta7 中的 NSString.sizeWithAttributes()

将 Xcode 6 beta 6 更新到 beta 7 后出现“可选错误”

XCode 6 Beta 6 Beta 7 中的错误 - 可选类型的值未解包

可选类型 '$T11' 不能用作布尔值;自安装 XCode 6 beta 7 以来测试 '!= nil'

可选类型 '$T11' 不能用作布尔值;自安装 XCode 6 beta 7 以来测试 '!= nil'