Respuesta

12

Para convertir una matriz genérica en NSData, necesita un archivador. Si sabe cómo alimentar el NSData, sabe cómo usar NSKeyedArchiver. Por lo tanto:

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

Por supuesto, todos los elementos en sus necesidades para implementar arrayencodeWithCoder:.

+4

Para completar, utiliza un NSKeyedUnarchiver para hacer lo contrario. –

+0

"todos los elementos en su matriz necesitan implementar encodeWithCoder:" <- esto solo es necesario para objetos personalizados? –

+0

todos los elementos de su matriz deben tener una implementación de 'encodeWithCoder:', ya sea por Apple o por usted. Puede verificar si un objeto suministrado por Apple lo implementa o no al echar un vistazo a la documentación oficial ... ver si implementa el protocolo 'NSCoder'. – Yuji

13

La respuesta de Yuji es correcta. pero con mayor precisión, el elemento de una matriz tienen que implementar el protocolo y FILL su propio código para métodos initWithCoder: y encodeWithCoder: como:

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

continuación, puede utilizar el archivador y unchariver como:

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

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

Para obtener más información, puede obtener la referencia "Archiving Objective-C Objects with NSCoding".

Cuestiones relacionadas