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

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

概述在更新到 Xcode 6.3(beta 1)和 Swift 1.2之后,我所有的应用程序只是神秘地崩溃版本版本.在更新Swift 1.2的代码之后,在Debug版本中,它们工作正常.调试器没有意识到发生崩溃的原因,不清楚为什么.一些崩溃是 malloc: *** error for object 0x7ff0c3824800: pointer being freed was not alloca 在更新到 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版本中运行.

总结

以上是内存溢出为你收集整理的xcode – Swift 1.2中的神秘崩溃 – 仅在版本中构建全部内容,希望文章能够帮你解决xcode – Swift 1.2中的神秘崩溃 – 仅在版本中构建所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1097470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存