xcode – Swift 1.2中的神秘崩溃 – 仅在版本中构建

在更新到 Xcode 6.3(beta 1)和 Swift 1.2之后,我所有的应用程序只是神秘地崩溃在版本版本.在更新Swift 1.2的代码之后,在Debug版本中,它们工作正常.调试器没有意识到发生崩溃的原因,不清楚为什么.一些崩溃是

malloc: *** error for object 0x7ff0c3824800: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug

其他的是“无法识别的选择器”,但它们没有意义;选择器发送的对象甚至不是我知道使用的对象.看来,内存管理出了问题,所以一个对象被替换为另一个对象.

这可能是什么原因造成的?在调用堆栈中没有什么用(所以我甚至不知道我的代码在哪里发生崩溃),当我逐步通过代码时,调试器的变量窗格中没有变量显示(这样我甚至不能看事情的价值),我甚至可以开始追踪它?

解决方法

令人惊讶的是,我确实跟踪了这一点,主要是通过删除大型色板中的代码,直到我只是这样(它是一个视图控制器):
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)
    }
}

如果(在版本构建中)我们提出这个视图控制器,然后解除它,我们在dealloc中崩溃,这证明了我的理论,这是内存管理的一个问题.

隔离代码后,我可以尝试各种替代方案.很明显,问题是属性var术语:[Term](因为Swift在dealloc中唯一的做法是释放这个数组).这个属性的值可以在我的init中看到,它是一个NSArray,它来自Cocoa(通过sortedArrayUsingDescriptors),并被转换为Swift数组.通过反复试验,我发现:

>如果我们更改实现以使该属性是NSArray(请参阅注释的替代行),我们不会崩溃.
>或者,如果我们不排序(所以这个NSArray不是来自可可),我们不会崩溃.
>或者(等待它),如果我们将self.terms = arr替换为! [term] with self.terms = arr as NSArray as! [期限],我们不会崩溃!

但是第三种替代方案是解决方法.我在我所有的应用程序中查找了所有的代码! [SomeType]将它们全部用NSArray替换为[SomeType],所有的崩溃都消失了!

我的理论是,Swift的内存管理在优化的版本编译中出现了一些问题,只是在NSArray从Cocoa到达的特定情况下,在我们的代码可以获得它们之前,我们将它们桥接到[AnyObject].这样的NSArray没有正确地穿过桥.但是通过转换到NSArray然后回到特定的[SomeType] Swift数组,问题就解决了.

当然,我认为当苹果公司指出这一点时,他们会解决这个问题,然后我们可以停止使用这种解决方法.但直到那时,我的应用程序再次在Release版本中运行.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...