2013-06-12 5 views
10

Muszę zarchiwizować numer float o wartości INFINITY, a później go zdekarchiwizować.
Oto mój przykładowy kod:float INFINITY może być zarchiwizowany przez NSCoder, ale nie został zdekarchiwizowany

Object być archiwizowane:

@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 

I tu jest archiwizacja/code dearchiving:

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

Archiwizacja działa, ale dearchiving podnosi błąd:

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

Czy to błąd w Dearchiverze, czy coś nie tak?

Odpowiedz

4

Wygląda jak błąd. Prześlij raport o błędzie do Apple.

Jako obejście użyj encodeDouble i decodeDoubleForKey - możesz zachować swoją wartość jako float i żadne rzuty nie są wymagane przez reguły C.

+0

Dzięki CRD, prześlę zgłoszenie błędu, a Twoje obejście jest w porządku! –

+0

Hej, @ ReinhardMänner przesłałeś raport o błędzie i jaki jest link? Właśnie napotkaliśmy podobny błąd w systemie iOS 8.3 z wartością zmiennoprzecinkową kodowania/dekodowania. Dzięki! – Danik

+0

@Danik: Złożyłem raport o błędzie 12 czerwca 2013 r., Ale nigdy nie otrzymałem odpowiedzi i jest ona nadal otwarta. Numer referencyjny to 14126397. Czy jest to "link", o który prosiłeś? Lub jak mogę uzyskać link do tego raportu? –

Powiązane problemy