2013-06-12 6 views
10

Ich muss eine float mit Wert INFINITY archivieren und später zu dearchivieren.
Hier ist mein Beispielcode:Float INFINITY kann von NSCoder archiviert, aber nicht dearchiviert werden

Objekt archiviert werden:

@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 

Und hier ist die Archivierung/Dearchivieren Code:

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

Archivierung funktioniert, aber Dearchivierung wirft den Fehler:

* Terminating app due to uncaught exception 'NSRangeException', reason: '* -[NSKeyedUnarchiver decodeFloatForKey:]: value (inf) for key (INFINITY) too large to fit in 32-bit float'

Ist das ein Fehler im Dearchiver, oder mache ich etwas falsch?

Antwort

4

Sieht aus wie ein Fehler. Senden Sie einen Fehlerbericht an Apple.

Als Workaround verwenden Sie encodeDouble und decodeDoubleForKey - Sie können Ihren Wert als float behalten und keine Umwandlungen von C-Regeln benötigt.

+0

Dank CRD, ich werde einen Fehlerbericht einreichen, und Ihre Workaround ist in Ordnung! –

+0

Hey, @ ReinhardMänner hast du einen Fehlerbericht eingereicht und was ist der Link? Wir hatten gerade einen ähnlichen Absturz auf iOS 8.3 mit dem Float-Wert für die Codierung/Decodierung. Vielen Dank! – Danik

+0

@Danik: Ich habe einen Bug-Bericht 12. Juni 2013 eingereicht, aber bekam nie eine Antwort und es ist noch offen. Die Referenznummer lautet 14126397. Ist das der "Link", nach dem Sie gefragt haben? Oder wie kann ich einen Link zu diesem Bericht erhalten? –

Verwandte Themen