2017-11-03 4 views
2

zu Xcode9 Nach dem Upgrade erhalten wir einen Crash/Warnung (wie eine Warnung aussieht, sondern verhält sich wie ein Absturz), wenn wir ein Mock-Objekt mit [NSKeyedArchiver archivedDataWithRootObject:mockObject] zu kodieren versuchen:Können Sie den "crash/warning" -Namen für den "crash/warn" in NSKeyedArchiver archivedDataWithRootObject deaktivieren?

Attempting to archive Swift class 'Foo.MockUser' with mangled runtime 
name '_TtCC13Foo27Bar8MockUser'. The runtime name for this class is 
unstable and may change in the future, leading to non-decodable data. 

Gibt es eine Möglichkeit oder Arbeit zu deaktivieren um das herum?

+0

Haben Sie diesen Link https://stackoverflow.com/questions/45751848/how-to-save-a-generic-custom-object-to-userdefaults überprüft? – trungduc

Antwort

1

Da sich die Warnung auf Swift bezieht, nehme ich an, dass Ihr Spott in Swift geschrieben ist. In diesem Fall müssen Sie ein @objc-Attribut mit einem Namen hinzufügen, genau wie in der Warnung vorgeschlagen.

Wenn dies die erste Version der App ist (dh es ist nicht um ein Update eine bereits veröffentlichte app), kann es nur ein vorangestellter Namen wie diese:

@objc(ABCDEFMockUser)class MockUser: NSObject, NSCoding { 
    ... 
} 

* beachten Sie, dass „ABCDEF“ Hier ist alles, was Sie wollen, aber "MockUser" muss mit Ihrem Klassennamen übereinstimmen.

Wenn jedoch eine Live-Version Ihrer App bereits in der freien Wildbahn ist und nicht nach dem Update abstürzen soll, benötigen Sie dort einen speziellen Namen. Dieser Name wird in die Xcode-Warnung selbst geschrieben. In Ihrem Fall ist es:

@objc(_TtCC13Foo27Bar8MockUser)class MockUser: NSObject, NSCoding { 
    ... 
} 

Eigentlich ist der einfachste Weg, nur das gelbe Warnzeichen klicken und „Fix“ in dem ersten Xcode Vorschlag sagen: „Um die Kompatibilität mit bestehenden Archiven Verwendung ...“ getroffen. Das ist es.

+0

"Eigentlich ist der einfachste Weg, einfach auf das gelbe Warnzeichen zu klicken" - das Problem ist, dass wir dies mit einem roten Fehler sahen. Ich stimme zu, dass dies nur eine Warnung sein sollte, aber es verhält sich wie ein Unfall. Ich habe dies noch nicht auf Xcode 9.1 oder höher getestet - hoffentlich ist es in den neueren Versionen behoben. – mattliu

+0

@mattliu könnte das sein, weil Ihr Archivierungscode in Obj-C ist? In meinem Fall hatte ich den Code, der das Archivieren/Entpacken und das Objekt selbst alle in Swift macht. – Vitalii

Verwandte Themen