Odpowiedz

12

Aby przekonwertować ogólną tablicę na NSData, potrzebujesz archiwizatora! Jeśli wiesz, jak karmić NSData, wiesz, jak korzystać z NSKeyedArchiver. Więc:

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

Oczywiście wszystkie elementy w swoich array musi wdrożyć encodeWithCoder:.

+4

Dla kompletności, używasz NSKeyedUnarchiver, aby wykonać odwrotność. –

+0

"wszystkie elementy w twojej tablicy muszą implementować encodeWithCoder:" <- jest to wymagane tylko w przypadku obiektów niestandardowych? –

+0

wszystkie elementy w twojej tablicy muszą mieć implementację 'encodeWithCoder:', przez Apple lub przez ciebie. Możesz sprawdzić, czy obiekt dostarczony przez Apple zaimplementował go, sprawdzając oficjalną dokumentację ... czy implementuje protokół 'NSCoder'. – Yuji

13

Odpowiedź Yuji jest słuszna. ale dokładniej, twój element tablicy trzeba zaimplementować protokół i wypełniam swój własny kod do metod initWithCoder a encodeWithCoder: jak:

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

następnie można użyć do archiwizacji i unchariver jak:

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

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

Aby uzyskać więcej informacji, można uzyskać odwołanie "Archiving Objective-C Objects with NSCoding".