NSKeyedArchiver archivedDataWithRootObject: - PullRequest
       41

NSKeyedArchiver archivedDataWithRootObject:

6 голосов
/ 19 сентября 2010

Является ли параметр для NSKeyedArchiver archivedDataWithRootObject: должен быть массив, который я пытаюсь сохранить, или массив преобразован в NSData?

Ответы [ 2 ]

16 голосов
/ 29 января 2013

Юджи ответил правильно.но точнее, ваш элемент массива должен реализовать протокол и заполнить ваш собственный код методами initWithCoder: и encodeWithCoder: like:

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.title = [decoder decodeObjectForKey:@"title"];
        self.author = [decoder decodeObjectForKey:@"author"];
        self.published = [decoder decodeBoolForKey:@"published"];
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:title forKey:@"time"];
    [encoder encodeObject:author forKey:@"author"];
    [encoder encodeBool:published forKey:@"published"];
}

, тогда вы можете использовать архиватор и unchariver, например:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"];

NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];

Более подробно вы можете получить ссылку " Архивация объектов Objective C с NSCoding ".

12 голосов
/ 19 сентября 2010

Чтобы преобразовать общий массив в NSData, вам нужен архиватор!Если вы знаете, как кормить NSData, вы знаете, как использовать NSKeyedArchiver.Итак:

NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];

Конечно, все элементы в вашем array должны быть реализованы encodeWithCoder:.

...