错误“[general] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving ...”

Error "[general] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving ..."

我使用的是 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 上编译的每个应用程序似乎都会发生这种情况。所以它可能是一个普通的苹果错误

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

NSError* err;

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

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

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

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

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

另一种相关情况是,如果您使用的是 NSCoder。

此代码生成了警告:

self.expression = [aDecoder decodeObjectForKey: kExpression];

警告已消除:

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

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