这个Swift iPad崩溃日志是什么意思?

应用运行良好的每个设备符合9.3 + iPad2 以外的部署目标。 url是好的。 适用于所有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的一个模型。

崩溃日志在我头上。 这对你们有没有意义? 谢谢。

在这里输入图像说明 在这里输入图像说明

编辑:展开崩溃日志

在这里输入图像说明 在这里输入图像说明

tl; dr:这是Swift数据types中的一个错误。 解决scheme:在您的UIDocument contents(forType:)实现中,更改此:

 return data 

对此:

 return NSData(data:data) 

更多信息:请注意,仅仅将data投射到NSData将无济于事:

 return data as NSData 

这不会让我们更进一步,因为这是桥梁问题。 我们已经连接到NSData,并没有帮助。 你必须创build一个不是Swift数据对象的全新对象。


更多信息:对于后来想要testing的人来说,碰撞可以可靠地复制如下。 像往常一样使用一个应用程序委托和一个ViewController来创build一个新的Single View项目。 在ViewController.swift文件中,把这个:

 import UIKit class WhatsUpDoc: UIDocument { var array = [String]() override func load(fromContents contents: Any, ofType typeName: String?) throws {} override func contents(forType typeName: String) throws -> Any { let data = NSKeyedArchiver.archivedData(withRootObject: array) return data // comment out this line to avoid the crash return NSData(data:data) } } class ViewController: UIViewController { var doc : WhatsUpDoc? override func viewDidLoad() { super.viewDidLoad() let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let baseURL = documentsDirectory.appendingPathComponent("Untitled") let doc = WhatsUpDoc(fileURL: baseURL) self.doc = doc self.doc!.save(to:self.doc!.fileURL, for: .forCreating) } } 

configuration你的项目有一个9.0的部署目标,并确保你手头上有一个9.0模拟器SDK。 在“窗口”>“设备”中,给自己一个iPad 2模拟器。 将该模拟器设置为项目的目的地。 运行,并崩溃。 评论说出来的评论线,并没有崩溃。


分析后问答:

等等,那究竟是什么错误呢? 你不是说你不能写一个Swift Data对象到磁盘,对吗?

不,在UIDocument文件保存期间,与写入的特殊线程性有关。 请注意,我们正在后台线程(OP的屏幕截图中的线程10或11)崩溃。 而我们正在崩溃是一个SwiftNSData的方法,NSData是由Swift Data包装的。 我们试图枚举在这个后台线程的数据的字节,我们不能; 据推测,这在某些设备types(即32位设备)上不是线程安全的。 我的解决scheme是将Swift Data完全移出图片。

好吧,事实certificate这个错误是已知的。 答案在这里给出: https : //stackoverflow.com/a/41163395/341994那么呢?

好的,但是我现在回答了这个问题。 直到后来,我才发现其他的问题和答案,当时我发现search。 所以我把当前的问题标记为重复的,但是我为了历史的目的而离开我的答案,尤其是, 因为它提供了一个明确的testing用例(其他问题没有)。

顺便说一句,我不知道为什么使用NSMutableData(data:)会比我使用NSData(data:)解决scheme更好,但是这就是苹果所说的,所以让我们把它作为福音。