別のカスタムオブジェクトを含むカスタムオブジェクトをNSUserDefaultsに保存する

私はどのようにNSUserのデフォルトでカスタムオブジェクトを格納する方法を理解していますが、私は内部のオブジェクトのための同じ手順に従って(それは私が間違っていない場合は構図と呼ばれている)最初の1つは、私はランタイムエラーを持っています。すべてを正しく保存して取得するために、私が実行しなければならない手順を細かく記述してください

0
あなたのしたこと(あなたのコード)を表示して、何が間違っているか教えてください。
追加された 著者 rob mayoff,
ランタイムエラー。
追加された 著者 Josh Caswell,

1 答え

すべてのオブジェクトはNSCodingプロトコルを実装する必要があります。 NSCodingは、保存されるオブジェクトに対して再帰的に動作します。たとえば、2つのカスタムクラス

@interface MyClass : NSObject {

}
@property(nonatomic, retain) NSString *myString;
@property(nonatomic, retain) MyAnotherClass *myAnotherClass;

@interface MyAnotherClass : NSObject {

}
@property(nonatomic, retain) NSNumber *myNumber;

MyClassオブジェクトをNSUserDefaultsに保存するには、次の両方のクラスにNSCodingプロトコルを実装する必要があります。

ファーストクラスの場合:

-(void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.myString forKey:@"myString"];
    [encoder encodeObject:self.myAnotherClass forKey:@"myAnotherClass"];
}

-(id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if ( self != nil ) {
        self.myString = [decoder decodeObjectForKey:@"myString"];
        self.myAnotherClass = [decoder decodeObjectForKey:@"myAnotherClass"];
    }
    return self;
}

2番目のクラスの場合:

-(void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.myNumber forKey:@"myNumber"];
}

-(id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if ( self != nil ) {
        self.myNumber = [decoder decodeObjectForKey:@"myNumber"];
    }
    return self;
}

上記の別のクラス(MyAnotherClass)にもカスタムオブジェクトがある場合、そのカスタムオブジェクトはNSCodingを実装する必要があります。暗黙的にカスタムオブジェクトを含むNSArrayを持っていても、これらのオブジェクトに対してNSCodingを実装する必要があります。

4
追加された
おかげさまで多くの友達
追加された 著者 Andrey Chernukha,
私はあなたがこれをすることができないと確信しています。 stackoverflow.com/a/19720674/8047 まず NSData に変換する必要があります。
追加された 著者 Dan Rosenstark,
あなたはファーストクラスで教えていただけますか?私はMyAnotherClassで配列を持っています。どのようにNSCodingを使うことができますか?
追加された 著者 Kittu,