【发布时间】:2017-02-24 16:45:22
【问题描述】:
应用程序在符合 9.3+ 部署目标的每台设备上都能正常运行除了 iPad2。网址很好。适用于每部 iPhone 和所有其他 iPad。崩溃发生在物理 iPad2 和模拟器 iPad2 iOS 9.3 上。
doc.save(to: target, for: .forCreating, completionHandler: {(success) in
if (success) {
print("Save succeeded")
}
} else {
print("Save failed")
}
})
这是崩溃的地方。到达这一行的断点,不要到达完成处理程序中的断点或打印。同样,只有 iPad 的一种型号。
崩溃日志在我头上。这对你们中的任何人都有意义吗?谢谢。
编辑:扩展崩溃日志
【问题讨论】:
-
当您打开 Address Sanitizer 或 Zombie Objects(就像您在发布此问题之前应该有一样)时,您看到了什么?
-
很抱歉没有做我应该做的,但我不知道地址消毒剂或僵尸对象是什么。在此之前从未听说过它们,所以不知道打开/关闭它们。现在将尝试弄清楚它们是什么。
-
我有点生硬,但我确实想强调 Apple 提供的令人难以置信的工具。
objc_retain或objc_release或任何类似的保留/释放主题调用中的崩溃表明内存管理不善。在 Edit Scheme...->Run->Diagnostics 选项卡中启用 Zombie Objects 是一个不错的起点。注意:僵尸是 Cocoa 表达“悬空指针”的方式。 -
:) 我得到了令人难以置信的工具,尽管有时你甚至不知道它们的存在,直到你第一次遇到这种情况。 Swift 的内存使用是有道理的。我得到“悬空指针”是/c 我在 80 年代使用 C 和 MPW。但是这个对 doc.save 的调用是从 Swift 发出的,它显然调用了我没有编写的 objc 代码,这就是我迷路的地方。打开 AS 和 ZO,但还没有弄明白结果如何。确实有继续进行的计划(消除保存代码直到什么都没有......消除过程)。令人困惑的是,这只是一个 iOS 版本上的一个模型。
-
这里有一些猜测......它正在创建一个块并试图捕获一些对象。该对象已被释放,因此,
retain尝试引用了无效地址。你试过僵尸的建议吗? (是否有任何与UIDocument关联的委托类型对象?调用doc.save的控制器是否仍然有效?)