错误“[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.
我使用的是 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.