Meine app verwendet die folgende Funktion eine Reihe von benutzerdefinierten Objekte serialise (nur relevante Code dargestellt wird):Absturz beim Datenarchivierung von NSKeyedArchiver
class func serializeShoppingLocations(buyLocations: Set<ShoppingLocation>) -> Data {
#if os(iOS)
NSKeyedArchiver.setClassName("ShoppingLocation", for: ShoppingListIOS.ShoppingLocation.self)
#elseif os(watchOS)
NSKeyedArchiver.setClassName("ShoppingLocation", for: ShoppingListWatch.ShoppingLocation.self)
#endif
let data = NSKeyedArchiver.archivedData(withRootObject: buyLocations)
return data
}
Die bedingte Kompilierung für die iOS und watchOS Ziele erforderlich ist, um damit beide Ziele später die serialisierten Daten dearchivieren können, selbst wenn sie vom anderen Ziel archiviert wurden.
ShoppingLocation
übernimmt das Protokoll NSCoding
und erbt von NSObject
.
Dieser Code stürzt bei der let data = …
Anweisung mit EXC_BAD_ACCESS (code=1, address=0x0)
ab.
Ich weiß, dass der Fehler wahrscheinlich darauf hinweist, dass ein nicht vorhandenes Objekt verwiesen wird. Die Variable buyLocations
ist jedoch vorhanden, und ich kann den Wert im Debugger einschließlich aller Werte der Objekte im Satz ausgeben.
Der Stack-Trace zeigt an, dass die Archivierungs die NSSet
zu archivieren startet und versucht, eines der Elemente des Satzes zu archivieren, aber setObjectForKey
in der internen wandelbar Wörterbuch ausfällt.
Was könnte der Grund sein?
EDIT:
Während der weitere Tests I, dass der Crash realisiert geschieht immer dann, wenn mindestens 2 Fäden der app aktiv sind.
Insbesondere fand ich eine Situation, in der ein Faden (rot in Xcode) abgestürzt ist an einem unterschiedlichen Befehl von dem oben erwähnten:
let dataBlob = NSKeyedArchiver.archivedData(withRootObject: shoppingItem.buyLocations)
und der andere Faden an der Instruktion gestoppt oben (in Xcode grün) erwähnt:
let data = NSKeyedArchiver.archivedData(withRootObject: buyLocations)
Könnte es sein, dass NSKeyedArchiver
nicht Thread-sicher ist?
stellen Sie sicher, dass ShoppingLocation von NSObject erbt –
@Leo Dabus Danke für den Hinweis, aber ShoppingLocation erbt von NSObject. Ich werde meine Frage aktualisieren. –