我在Swift中使用failable初始化器发生了一个奇怪的崩溃。我很确定这是Swift中的一个错误,但是我想我会快速发布一篇文章,看看我是否错过了一些明显的东西。使用failable初始化器崩溃
我正在写使用CloudKit一个应用程序,并增加了新的便利初始化到CKRecord:
extension CKRecord {
convenience init?(cloudInfo: NSData?) {
guard let info = cloudInfo else { return nil }
self.init(coder: NSKeyedUnarchiver(forReadingWithData: info))
}
这只是利用我使用CKRecord的encodeSystemFieldsWithCode:
方法来创建一个CKRecord
实例创建归档数据。我以前只是在我的课上有一个方法来做同样的事情,它运行良好。
当我把这个初始化是这样的:
let record: CKRecord
if let rec = CKRecord(cloudInfo: self.cloudInfo) {
record = rec
} else {
record = CKRecord(recordType: "Item", recordID: CKRecordID(recordName: self.id))
}
当我打这通电话,我得到一个崩溃。如果我传入cloudInfo
或值为零,这并不重要。在遍历代码时,崩溃似乎在从init调用返回并返回调用者之间发生。例如,如果我通过nil
并进入init
中的guard
声明似乎有效,但一旦我离开它,我就会崩溃。
我试过摆脱guard
并用简单的if let
构造,但结果相同。而且,我还刚刚从init
返回nil
,没有任何其他代码,并且这也崩溃了。
我已经做了usuals:清理build文件夹,重新启动等
BTW,由“撞车”我的意思是我得到:EXC_BAD_ACCESS (code=1, address=0xfffffffc)
在调用点。
有没有人有任何想法?也许这是显而易见的,我错过了。
谢谢。
你还可以提供调用堆栈吗? –
@AlexanderPerechnev没有真正的调用堆栈,将代码插入游乐场并观看它的崩溃。 – luk2302
我确定有一个调用堆栈。否则,'self.cloudInfo'和'self.id'从哪里来? –