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:)
的解决方案更好,但苹果公司就是这么说的,所以让我们把它当作福音。
应用程序在符合部署目标 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:)
的解决方案更好,但苹果公司就是这么说的,所以让我们把它当作福音。