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:.

+4

Per completezza, si utilizza un NSKeyedUnarchiver per eseguire l'inverso. –

+0

"tutti gli elementi dell'array devono implementare encodeWithCoder:" <- questo è necessario solo per gli oggetti personalizzati? –

+0

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

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".