問題

私はすべての午後、このクラスのデコードが失敗した理由を理解しようと壁に頭を叩いていました。クラスには、FooオブジェクトのNSArrayであるプロパティがあります。 FooはNSSecureCodingに準拠しています。私は正常にinitWithCoderでそのクラスをエンコードしてデコードしました。私はinitWithCoderでエラーが発生していました。いくつかの実験を通して、私は[Fooクラス]をinitWithCoderに追加する必要があることを発見しました。おそらくこれ

 #import "Foo.h"

@interface MyClass : NSObject <NSSecureCoding>
@property (nonatomic) NSArray *bunchOfFoos;
@end

@implementation MyClass

static NSString *kKeyFoo = @"kKeyFoo";

+ (BOOL) supportsSecureCoding
{
    return YES;
}

- (void) encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:self.bunchOfFoos forKey:kKeyFoo];
}

- (id) initWithCoder:(NSCoder *)decoder
{
    if (self = [super init])
    {
        [Foo class]; // Without this, decoding fails
        _bunchOfFoos = [decoder decodeObjectOfClass:[NSArray class] forKey:kKeyFoo];
    }
    return self;
}

@end
 

  ベストアンサー

まだこれに苦しんでいる人のために:@ Ben Hの解決策は私の問題を解決しませんでした。そして、私は次のエラーメッセージが表示され続けます:

uncodeFunction例外 'NSInvalidUnarchiveOperationException'によるアプリケーションの終了、理由:>キー 'NS.objects'の 'value'は予期しないクラス 'ClassA'でした。許可されたクラスは '{(
または NSArray
または ')}' です。

最後に、私はカスタムクラスのためにそれを実現しました。 decodeObjectOfClasses の代わりに次の関数を使用する必要があります。

 - (id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key
 

上記の関数にNSArrayのすべての可能なクラスのNSSetを渡す必要があります! @Ben Hが関数の外に[Foo class]を追加するだけで問題を解決できる理由がわかりません。たぶんそれはコンパイラの問題です。しかし、とにかく、彼の解決策がうまくいかない場合は、これも試してみてください。

  同じタグがついた質問を見る

iosobjective-cnsarraynscodingnssecurecoding