iOS 11 归档解档方法 Domain=NSCocoaErrorDomain Code=4864 "value for key 'NS.objects'

981 阅读1分钟

一、项目支持到iOS11.0以上之后,提示归解档之前的方法被废弃。

归档新方法为:+archivedDataWithRootObject:requiringSecureCoding:error:
解档新方法为:+unarchivedObjectOfClass:fromData:error:

1.直接传入对应的类

NSError *err = nil;
id item = [NSKeyedUnarchiver unarchivedObjectOfClass:[class 类]] fromData:data error:&err];

2.直接使用NSObject

NSError *err = nil;
id item = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:data error:&err];

3.直接传入NSSet集合,解档时传入此集合:

NSError *err = nil;
id item = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithArray:@[class 集合]] fromData:data error:&err];

二、本文主要记录进行解档时遇到的问题,当本人的数据结构为字典中包含模型数组时,进行解档操作遇到以下问题:

Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'NS.objects' was of unexpected class 'XXXXXModel'. Allowed classes are '{(

NSArray

)}

三、解档方法设置为decodeObjectOfClasses,而不是使用decodeObjectOfClass:

[aDecoder decodeObjectOfClasses:@[class 集合] forKey:key]

注:使用NSObject.class方法会有如下警告,请使用‘直接传入对应的类’的方式: [Foundation] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:]: NSSecureCoding allowed classes list contains [NSObject class], which bypasses security by allowing any Objective-C class to be implicitly decoded. Consider reducing the scope of allowed classes during decoding by listing only the classes you expect to decode, or a more specific base class than NSObject. This will become an error in the future. Allowed class list: {(

"'NSObject' (0x1f104f208) [/usr/lib]"

)}