Répondre

12

Pour convertir un tableau générique en NSData, vous avez besoin d'un programme d'archivage! Si vous savez comment nourrir le NSData, vous savez comment utiliser NSKeyedArchiver. Alors:

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

Bien sûr tous les éléments de vos besoins array à mettre en œuvre encodeWithCoder:.

+4

Pour être complet, vous utilisez un NSKeyedUnarchiver pour faire l'inverse. –

+0

"tous les éléments de votre tableau doivent implémenter encodeWithCoder:" <- ceci est seulement nécessaire pour les objets personnalisés? –

+0

tous les éléments de votre tableau doivent avoir une implémentation de 'encoderCithCoder:', soit par Apple ou par vous. Vous pouvez vérifier si un objet fourni par Apple l'implémente ou non en consultant la documentation officielle ... voyez s'il implémente le protocole 'NSCoder'. – Yuji

13

La réponse de Yuji est juste. mais avec plus de précision, votre élément d'un tableau doivent mettre en œuvre le protocole et fillin votre propre code aux méthodes initWithCoder: et encodeWithCoder: comme:

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

vous pouvez utiliser l'archiveur et unchariver comme:

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

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

Pour en savoir plus, vous pouvez obtenir la référence "Archiving Objective-C Objects with NSCoding".