Il parametro per NSKeyedArchiver archiviatoDataWithRootObject: si suppone che sia l'array che sto tentando di salvare o la matrice convertita in NSData?NSKeyedArchiver archiviatoDataWithRootObject:
6
A
risposta
12
Per convertire un array generico in un NSData
, è necessario un archiviatore! Se sai come alimentare il NSData
, sai come usare NSKeyedArchiver
. Quindi:
NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];
Naturalmente tutti gli elementi del array
deve attuare encodeWithCoder:
.
13
La risposta di Yuji è giusta. ma più precisamente, il vostro elemento di un array deve implementare il protocollo e fillin il proprio codice ai metodi initWithCoder: e encodeWithCoder: come:
- (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"];
}
quindi è possibile utilizzare l'archiviazione e unchariver come:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"];
NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];
Per ulteriori informazioni, è possibile ottenere il riferimento "Archiving Objective-C Objects with NSCoding".
Per completezza, si utilizza un NSKeyedUnarchiver per eseguire l'inverso. –
"tutti gli elementi dell'array devono implementare encodeWithCoder:" <- questo è necessario solo per gli oggetti personalizzati? –
tutti gli elementi del tuo array devono avere un'implementazione di 'encodeWithCoder:', sia da Apple che da te. Puoi controllare se un oggetto fornito da Apple lo implementa o no dando un'occhiata alla documentazione ufficiale ... vedi se implementa il protocollo 'NSCoder'. – Yuji