2

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

4

2 回答 2

3

感谢@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];
于 2021-11-21T19:20:28.267 回答
1

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

此代码生成了警告:

self.expression = [aDecoder decodeObjectForKey: kExpression];

通过以下方式消除警告:

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

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

于 2022-01-08T17:08:46.937 回答