0

私はmacOS 10.15(bigSUr)、XCode 12、iosではなくobjective-cを使用しています。

ドキュメントベースのアプリがあります。カスタムクラス「SHSetupDataModel」(NSObject)のプロパティオブジェクトを含む単純なオブジェクト「SHGlobalAppData」(NSObject)があります。

読み込み時に、initWithCoder は保存された値に対して nil を返します。なんで?

これは実装です:

私は 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];
    // [...]
}

これにより、SHGlobalAppData から initWithCoder メソッドが呼び出されます - ここで nil の結果が得られます

- (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?              
        }
        // [...]
    }
}

これがnilを返す理由を教えてください。または、より効果的なデバッグに向けて私を導きますか?

4

1 に答える 1