float INFINITY peut être archivé par NSCoder, mais pas désarchivé

Je dois archiver un float avec la valeur INFINITY , et plus tard le dearchive.
Voici mon exemple de code:

Objet à archiver:

 @interface CodeInf : NSObject <NSCoding> @end @implementation CodeInf - (void)encodeWithCoder:(NSCoder *)encoder { float inf = INFINITY; [encoder encodeFloat: inf forKey:@"INFINITY"]; } - (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { float decodedInf = [decoder decodeFloatForKey: @"INFINITY"]; } return self; } @end 

Et voici le code d'archivage / de désarchivage:

 CodeInf *myCodeInf = [[CodeInf alloc] init]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myCodeInf]; myCodeInf = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

L'archivage fonctionne, mais l'archivage pose l'erreur:

* Terminaison de l'application due à l'exception non interceptée 'NSRangeException', raison: '* – [NSKeyedUnarchiver decodeFloatForKey:]: valeur (inf) de la key (INFINITY) trop grande pour tenir dans le flottant 32 bits'

Est-ce un bug dans le Dearchiver, ou ai-je quelque chose de mal?

On dirait un bug. Soumettre un rapport de bug à Apple.

En guise de solution de contournement, utilisez encodeDouble et decodeDoubleForKey – vous pouvez conserver votre valeur en tant que valeur float et aucun format n'est requirejs par les règles C.