Рекурсивное архивирование классов в Objective C - PullRequest
0 голосов
/ 22 марта 2012

Допустим, я определяю ClassA, который реализует протокол NSCoding (этот класс содержит несколько переменных, таких как NSString, NSArray и т. Д.).Я также создаю ClassB, в котором есть переменная типа ClassA.Примерно так:

 @interface ClassB: NSObject <NSCoding>
 {
     NSString *str;
     NSDate *date;
     int x;
     ClassA *sc;
 } 

В моей программе я хотел бы заархивировать переменную типа ClassB.Можно ли рекурсивно архивировать пользовательские объекты?Если да, то как?

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Вам необходимо реализовать интерфейс NSCoding для вашего ClassB:

- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super initWithCoder:decoder];
    if (self)
    {
        str = [[decoder decodeObjectForKey:@"MyStr"] retain];
        date = [[decoder decodeObjectForKey:@"MyDate"] retain];
        x = [decoder decodeIntegerForKey:@"MyX"];
        sc = [decoder decodeObjectForKey:@"MyClassA"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [super encodeWithCoder:encoder];
    [encoder encodeObject:str forKey:@"MyStr"];
    [encoder encodeObject:date forKey:@"MyDate"];
    [encoder encodeInteger:x forKey:@"MyX"];
    [encoder encodeObject:sc forKey:@"MyClassA"];
}

ClassA также должен реализовывать протокол NSCoding.

1 голос
/ 22 марта 2012

Подобно тому, как сериализация работает в Java, архивация через NSCoder работает аналогично в ObjC.По сути, каждый объект кодируется с помощью идентификатора, а каждый объект, являющийся членом другого объекта, кодируется как этот идентификатор, а не как отдельный объект.Таким образом, вы можете безопасно иметь рекурсивные объекты.

...