我在macOS 10.15 (bigSUr),XCode 12,目标-c,而不是ios。
我有基于文档的应用程序。它有一个简单的对象"SHGlobalAppData“(NSObject),它包含自定义类"SHSetupDataModel”(NSObject)的属性对象。
加载时,initWithCoder返回保存的值为零。为什么?
这就是执行情况:
我使用NSSecureCoding,因此SHSetupDataModel和SHGlobalAppData都包含了适当的类方法。
+ (BOOL)supportsSecureCoding { return YES;}保存是在NSDocument中使用安全编码完成的。
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initRequiringSecureCoding:YES];
[archiver encodeObject:self.appData forKey:@"appData"]; // SHSetupDataModel is a property of appData object
//[...]
}储蓄是如何实现的
当谈到保存时,这是SHGlobalAppData的代码
- (void)encodeWithCoder:(NSCoder *)coder {
// Other properties here
if (_setupData){
// Tests
NSLog(@"%@",[_setupData className]); // returns "SHSetupDataModel"
BOOL test = [_setupData isKindOfClass:[SHSetupDataModel class]]; // returns TRUE
[coder encodeObject:_setupData forKey:@"setupData"];
}
}上述储蓄顺利进行。测试没问题。
如何完成装载
现在,当加载保存的文件时,将调用以下NSDocument方法:
- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError *__autoreleasing _Nullable *)outError {
NSData* data = [[NSData alloc] initWithContentsOfURL:url];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:outError];
[unarchiver setRequiresSecureCoding:YES];
// Load appData
SHGlobalAppData* appData = [unarchiver decodeObjectOfClass:[SHGlobalAppData class] forKey:@"appData"];
[unarchiver finishDecoding];
// [...]
}这将调用initWithCoder方法表单SHGlobalAppData,其中我得到了一个零结果。
- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
if ([coder containsValueForKey:@"setupData"]){
_setupData = [coder decodeObjectOfClass:[SHSetupDataModel class] forKey:@"setupData"]; // <---- This is nil. Why?
}
// [...]
}
}有谁能帮我一下为什么这是零吗?还是带我去一个更有效的调试?
发布于 2021-04-05 07:13:01
数据模型本身包含一个没有正确解码的NSDictionary。解决方案是对outError进行分析,然后逐步通过initWithCoder方法进行工作。最后,我必须在decodeObjectWithClasses:ofKey中传递多个类:
https://stackoverflow.com/questions/66929574
复制相似问题