сохранение пользовательского объекта, который содержит другой пользовательский объект, в NSUserDefaults - PullRequest
0 голосов
/ 27 октября 2011

Я понимаю, как сохранить пользовательский объект в NSUser Defaults, но когда я попытался реализовать сохранение объекта с объектом другого типа внутри (это называется композиция, если я не ошибаюсь), следуя тем же шагам для внутреннего объектакак я сделал для первого я получил ошибку во время выполнения.Не могли бы вы подробно описать шаги, которые я должен предпринять, чтобы все правильно сохранить и получить

1 Ответ

4 голосов
/ 27 октября 2011

Все ваши объекты должны реализовывать протокол 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;
}

Для второго класса:

-(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 для этих объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...