2013-06-12 4 views
10

floatを値INFINITYでアーカイブし、後でそれをアーカイブ解除する必要があります。float INFINITYはNSCoderによってアーカイブできますが、デアーカイブされません

オブジェクトアーカイブされる:
はここに私のコード例である

@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 

そして、ここでのアーカイブ/ dearchivingコードです:

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

アーカイブの作品は、しかしdearchivingでエラーが発生します:

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

これはデアーチバーのバグですか?または私は何か間違っていますか?

答えて

4

バグのようです。バグレポートをAppleに提出してください。

回避策として、encodeDoubledecodeDoubleForKeyを使用してください。値はfloatで、Cルールではキャストは必要ありません。

+0

CRDのおかげで、私はバグレポートを提出し、あなたの回避策は問題ありません! –

+0

ねえ、ReinhardMännerはバグレポートを提出しましたが、リンクは何ですか? iOS 8.3ではfloat値のエンコード/デコードで同様のクラッシュに遭遇しました。ありがとう! – Danik

+0

@ダニーク:2013年6月12日にバグレポートを提出しましたが、回答が得られず、まだ開いています。参照番号は14126397です。これはあなたが求めた「リンク」ですか?または、このレポートへのリンクを取得するにはどうすればよいですか? –

関連する問題