2013-06-12 6 views
10

Devo archiviare un float con il valore INFINITY e successivamente per cercarlo.
Ecco il mio codice di esempio:float INFINITY può essere archiviato da NSCoder, ma non dearchived

oggetto da archiviare:

@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 

Ed ecco l'archiviazione/code estratto dall'archivio:

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

archiviazione funziona, ma dearchiviazione genera l'errore:

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

Si tratta di un errore nel dearchiver, o faccio qualcosa di sbagliato?

risposta

4

Sembra un bug. Invia una segnalazione di bug ad Apple.

Come soluzione temporanea utilizzare encodeDouble e decodeDoubleForKey - è possibile mantenere il valore come float e nessun cast è necessario dalle regole C.

+0

Grazie CRD, invierò una segnalazione di bug e la soluzione è buona! –

+0

Ehi, @ ReinhardMänner hai inviato una segnalazione di bug e qual è il link? Abbiamo appena affrontato un crash simile su iOS 8.3 con valore float di codifica/decodifica. Grazie! – Danik

+0

@Danik: Ho presentato una segnalazione di bug il 12 giugno 2013, ma non ho mai ricevuto una risposta ed è ancora aperta. Il numero di riferimento è 14126397. È questo il "link" che hai richiesto? O come posso ottenere un link a questo rapporto? –