首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSSecureCoding为正确保存的对象返回零

NSSecureCoding为正确保存的对象返回零
EN

Stack Overflow用户
提问于 2021-04-03 09:31:57
回答 1查看 2.3K关注 0票数 0

我在macOS 10.15 (bigSUr),XCode 12,目标-c,而不是ios。

我有基于文档的应用程序。它有一个简单的对象"SHGlobalAppData“(NSObject),它包含自定义类"SHSetupDataModel”(NSObject)的属性对象。

加载时,initWithCoder返回保存的值为零。为什么?

这就是执行情况:

我使用NSSecureCoding,因此SHSetupDataModel和SHGlobalAppData都包含了适当的类方法。

代码语言:javascript
复制
+ (BOOL)supportsSecureCoding { return YES;}

保存是在NSDocument中使用安全编码完成的。

代码语言:javascript
复制
- (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的代码

代码语言:javascript
复制
- (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方法:

代码语言:javascript
复制
- (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,其中我得到了一个零结果。

代码语言:javascript
复制
- (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?              
        }
        // [...]
    }
}

有谁能帮我一下为什么这是零吗?还是带我去一个更有效的调试?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-05 07:13:01

数据模型本身包含一个没有正确解码的NSDictionary。解决方案是对outError进行分析,然后逐步通过initWithCoder方法进行工作。最后,我必须在decodeObjectWithClasses:ofKey中传递多个类:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66929574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档