archivedDataWithRootObject: est deprecated depuis IOS12.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@{}]; // deprecated ISO12
Cela va avec l'avancée de SWIFT qui ne permet pas facilement de faire des tableaux de "trucs" non définis. C'est la nouvelle option requiringSecureCoding qui indique si le tableaux (NSDictionnary ou NSArray) peut contenir n'importe quoi ou uniquement des objets bien définis.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@{} requiringSecureCoding:NO error:&error];
Le problème est que la fonction pour dés-archiver n'est pas deprecated, mais plante !
NSDictionary *dico = [NSKeyedUnarchiver unarchivedObjectOfClass:NSDictionary.class
fromData:data error:&error]; // plante
Si l'on désire faire comme avant, il faut un requiresSecureCoding:NO, mais il n'y a pas le pendant du archivedDataWithRootObject ! Il n'y a pas de decodeRootObject avec une option requiresSecureCoding...
On doit donc instancier un objet NSKeyedUnarchiver, puis spécifier le requiresSecureCoding, puis décoder l'objet.
NSError *error = nil;
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
unarchiver.requiresSecureCoding = NO;
NSDictionary *dico = [unarchiver decodeObjectOfClass:NSDictionary.class forKey:NSKeyedArchiveRootObjectKey];
Cela fait trois ligne à la place d'une, mais j'ai pris des jours pour comprendre le problème !
Commentaires