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

What does this Swift iPad crash log mean?

应用程序在符合部署目标 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 数据类型中的错误。解决方案:在您的 UIDocument contents(forType:) 实现中,将此更改为:

return data

对此:

return NSData(data:data)

更多信息: 请注意,仅将 data 转换为 NSData 无济于事:

return data as NSData

这对我们没有任何帮助,因为问题在于桥接。我们已经 连接到 NSData,但没有帮助。您必须创建一个不是 Swift 数据对象的全新对象。


更多信息: 对于来到这里并想要对此进行测试的后代,崩溃可以可靠地重现如下。像往常一样创建一个新的单视图项目,其中包含一个应用程序委托和一个 ViewController。在 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)
    }
}

将您的项目配置为具有 9.0 的部署目标,并确保您手头有一个 9.0 模拟器 SDK。在 Window > 设备中,给自己一个 iPad 2 模拟器。将该模拟器设置为项目的目的地。 运行,崩溃。把说要注释掉的那一行注释掉,不要崩溃。


Post-分析问答:

等等,那么问题到底_是什么?您不是说不能将 Swift 数据对象写入磁盘,是吗?

不,这与 UIDocument 文件保存期间写入的特殊线程性质有关。请注意,我们在后台线程中崩溃(OP 屏幕截图中的线程 10 或 11)。而我们在崩溃的是SwiftNSData的方法,NSData被Swift数据包裹。我们正试图在此后台线程上枚举数据的字节,但我们做不到;大概这在某些设备类型上不是线程安全的,即 32 位设备。我的解决方案是完全删除 Swift 数据。

好的,原来这个bug是已知的;答案在这里:怎么样?

好的,但我是根据当前问题独立想出来的。直到后来,当我想到进行搜索时,我才知道另一个问题和答案。因此,我已将当前问题标记为重复,但出于历史目的,我将留下我的答案,尤其是。因为它给出了一个清晰的测试用例(另一个问题没有)。

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