您是否可以为NSKeyedArchiver archivedDataWithRootObject禁用“损坏的运行时名称”崩溃/警告?

时间:2017-11-03 15:24:32

标签: ios objective-c swift xcode9

升级到Xcode9后,当我们尝试使用[NSKeyedArchiver archivedDataWithRootObject:mockObject]对模拟对象进行编码时,我们会收到崩溃/警告(看起来像警告,但表现得像崩溃):

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.

有没有办法禁用或解决这个问题?

1 个答案:

答案 0 :(得分:1)

由于警告引用了Swift,我想你的模拟是用Swift编写的。 在这种情况下,您需要添加一个带有名称的@objc属性,就像警告所示。

如果这是您应用的第一个版本(即它不是对已发布应用的更新),它可能只是一个带有此前缀的名称:

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

*请注意,“ABCDEF”在这里是您想要的任何内容,但“MockUser”必须与您的班级名称相匹配。

但是如果您的应用程序的实时版本已经存在并且您不希望它在更新后崩溃,那么您将需要一个特殊名称。这个名字写在Xcode的警告中。在你的情况下它是:

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

实际上最简单的方法是只需点击黄色警告标志,然后在第一个Xcode的建议中点击“修复”,说明“为了兼容现有存档使用......”。就是这样。