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版本中运行.