Xcode Swift 1.2中的神秘崩溃-仅限发布版本

Xcode Swift 1.2中的神秘崩溃-仅限发布版本,xcode,debugging,swift,Xcode,Debugging,Swift,在升级到Xcode 6.3(beta 1)和Swift 1.2之后,我所有的应用程序都神秘地在发布版本中崩溃。在调试版本中更新我的Swift 1.2代码后,它们工作正常。调试器不知道崩溃发生在哪里,也不清楚原因。一些事故是 malloc:**对象0x7ff0c3824800的错误:未分配要释放的指针***在malloc\u error\u break中设置断点以进行调试 另一些是“未被认可的选择器”,但它们毫无意义;选择器被发送到的对象甚至不是我知道正在使用的对象。内存管理似乎出了问题,因此一个

在升级到Xcode 6.3(beta 1)和Swift 1.2之后,我所有的应用程序都神秘地在发布版本中崩溃。在调试版本中更新我的Swift 1.2代码后,它们工作正常。调试器不知道崩溃发生在哪里,也不清楚原因。一些事故是

malloc:**对象0x7ff0c3824800的错误:未分配要释放的指针***在malloc\u error\u break中设置断点以进行调试

另一些是“未被认可的选择器”,但它们毫无意义;选择器被发送到的对象甚至不是我知道正在使用的对象。内存管理似乎出了问题,因此一个对象被另一个对象替换

究竟是什么导致了这一切?调用堆栈中没有任何有用的东西(因此我甚至不知道崩溃发生在代码中的什么地方),当我单步执行代码时,调试器的变量窗格中也没有显示任何变量(因此我甚至无法查看事物的值),我怎么能开始跟踪它呢?

令人惊讶的是,我确实跟踪到了这一点,主要是通过删除大样本中的代码,直到我了解到这一点(它是一个视图控制器):

如果(在一个发布版本中)我们展示了这个视图控制器,然后将其关闭,那么我们将在Disclose-in dealloc上崩溃,这证明了我的理论,即这是内存管理的问题

隔离代码后,我可以尝试各种替代方案。很明显,问题出在属性
var terms:[Term]
(因为Swift在
dealoc
中唯一做的事情就是释放这个数组)。正如您在my
init
中所看到的,此属性的值是一个NSArray,它来自Cocoa(通过
SorterDarrayusingDescriptors
),并已转换为Swift数组。经过反复试验,我发现:

  • 如果我们更改了实现,使属性成为NSArray(请参阅注释掉的备选行),我们就不会崩溃

  • 或者,如果我们不进行排序(这样这个NSArray就不会来自Cocoa),我们就不会崩溃

  • 或者(等待),如果我们替换
    self.terms=arr as![Term]
    with
    self.terms=arr as NSArray as![术语]
    ,我们不会崩溃

但第三种选择是一种变通办法。我浏览了我所有应用程序中的所有代码,寻找
as![SomeType]
将它们全部强制转换并替换为与[SomeType]一样的NSArray,我所有的崩溃都消失了

我的理论是,Swift在优化版本构建中的内存管理出了问题,只是在非常特定的情况下,NSArray从Cocoa到达,并在我们的代码能够获得它之前为我们桥接到一个
[AnyObject]
。这样的安排没有正确地过桥。但是通过强制转换到NSArray,然后返回到特定的
[SomeType]
Swift数组,问题就解决了


当然,我认为当苹果发现这一点时,他们会修复它,然后我们就可以停止使用这种变通方法。但在此之前,我的应用程序再次以发布版本运行。

我的错误报告编号是19835848。因此,如果你在自己的应用程序中看到这一点,并且你想报告它,你可以引用我的报告,如果你愿意的话。我没有找到解决办法yet@alexdd55我听说过这个问题的字符串版本,但我没有看到它。我想去。你有可复制的案例吗?(你有没有向苹果提交错误报告?)。在构建设置下,我搜索了“优化级别”,并将两者都设置为“无”。“这就停止了撞车。”马特,你能帮忙吗?虽然我不知道怎么开始。。。找不到日志
class LessonListController: UIViewController {
    var terms : [Term]
    // var terms : NSArray
    init(terms data:NSArray) {
        let arr = data.sortedArrayUsingDescriptors([NSSortDescriptor(key: "lessonSection", ascending: true)])
        self.terms = arr as! [Term]
        // self.terms = arr
        super.init(nibName:"LessonList", bundle:nil)
    }
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    @IBAction func doDismiss(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}