NSUserDefaults içine başka bir özel nesne içeren özel nesne kaydetme

NSUser Defaults'ta özel bir nesneyi nasıl saklayacağımı anladım, ancak içinde bir nesne farklı bir nesneyle kaydetmeyi denediğimde (yanlış değilse bile kompozisyon denir) iç nesneler için aynı adımları izleyerek ilki için çalışma zamanı hatası var. Her şeyi doğru bir şekilde kaydetmek ve almak için gerçekleştirmem gereken adımları kesinlikle tanımlayabilir misiniz?

0
Yaptığınız şeyi (kodunuzu) gösterin ve size neyin yanlış olduğunu söyleyelim.
katma yazar rob mayoff, kaynak
Ve çalışma zamanı hatası.
katma yazar Josh Caswell, kaynak

1 cevap

Tüm nesneleriniz NSCoding protokolünü uygulamalıdır. NSCoding, kaydedilecek nesneler için yinelemeli çalışır. Örneğin, 2 özel sınıfınız var

@interface MyClass : NSObject {

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

@interface MyAnotherClass : NSObject {

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

MyClass nesnesini NSUserDefaults'a kaydetmek için, bu iki sınıfa NSCoding protokolünü uygulamanız gerekir:

Birinci sınıf için:

-(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;
}

İkinci sınıf için:

-(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;
}

Not: Başka bir sınıfınız (yukarıdaki MyAnotherClass) ayrıca özel nesne içeriyorsa, o zaman özel nesne de NSCoding'i uygulamalıdır. NSArray uygulamasında bile, özel nesneler içeren, bu nesneler için NSCoding'i uygulamanız gereken bir örtücülük var.

4
katma
çok teşekkürler dostum
katma yazar Andrey Chernukha, kaynak
Eminim ki bunu yapamazsın. stackoverflow.com/a/19720674/8047 İlk önce NSData </​​code> 'a dönüştürmeniz gerekir.
katma yazar Dan Rosenstark, kaynak
lütfen bana ilk sınıfınızda söyleyebiliyor musunuz, MyAnotherClass ile bir dizim var. NSCoding'i nasıl kullanabilirim?
katma yazar Kittu, kaynak