【问题标题】:Error "[general] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving ..."错误“[general] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] 允许取消归档...”
【发布时间】:2021-11-20 21:30:36
【问题描述】:

我使用的是 macOS Monterey (12.0.1),而不是 iOS、objective-c、XCode 13

我在为 arm64 构建应用后收到此日志消息:

[general] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving safe plist type ''NSString' (0x1dcb1c848) [/System/Library/Frameworks/Foundation.framework]' for key 'NS.objects', even though it was not explicitly included in the client allowed classes set: '{(
    "'NSDictionary' (0x1dcaee5d0) [/System/Library/Frameworks/CoreFoundation.framework]"
)}'. This will be disallowed in the future.

知道是什么原因造成的以及如何摆脱它吗?

编辑:从 macOS Monterey 开始,在 arm64 上编译的每个应用程序似乎都会发生这种情况。所以它可能是一个通用的苹果错误

【问题讨论】:

  • 这不是错误,而是通知。它甚至可以准确地告诉你发生了什么。 NSDictionary 中允许 NSString 没有明确允许。这意味着您可能想阅读解码对象(NSKeyedUnarchiver)的变化。

标签: objective-c macos arm apple-m1 macos-monterey


【解决方案1】:

感谢@OI Sen,它对 NSUarchiver 有了更深入的了解。 首先 NSKeyedUnarchiver 应该像这样分配和初始化:

NSError* err;

NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:someData error:&err];

在我的具体情况下,我使用 NSSecure 编码。因此,您必须在解码对象上指定类。就我而言,它看起来像这样

NSDictionary* someDict = [unarchiver decodeObjectOfClass:[NSDictionary class] forKey:NSKeyedArchiveRootObjectKey];

但是 NSDictionary 包含额外的字符串。这就是日志消息的原因。通过将 NSString 添加到解码的类列表中,错误就消失了。

NSDictionary* someDict = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NSDictionary class],[NSString class]]] forKey:NSKeyedArchiveRootObjectKey];

【讨论】:

    【解决方案2】:

    另一个相关的情况是如果你使用的是 NSCoder。

    此代码生成了警告:

    self.expression = [aDecoder decodeObjectForKey: kExpression];

    警告消除:

    self.expression = [aDecoder decodeObjectOfClass:[NSString class] forKey:kExpression];
    

    注意使用 decodeObjectOfClass:[NSString class] 而不是 decodeObjectForKey

    【讨论】:

    • NSUnarchiver 基本上使用解码器来解码嵌套对象...
    猜你喜欢
    • 2021-11-20
    • 2018-12-31
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2010-11-19
    相关资源
    最近更新 更多