2013-06-12 7 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 

그리고 여기에 보관/tar를 풀면 코드 :

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

보관 작동은하지만, tar를 풀면는 오류가 발생합니다 :

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

dearchiver의 버그입니까? 아니면 내가 뭔가 잘못 됐니?

답변

4

버그처럼 보입니다. 버그 보고서를 Apple에 제출하십시오.

해결 방법으로 encodeDoubledecodeDoubleForKey을 사용하십시오.이 값을 float으로 유지할 수 있으며 C 규칙에 의한 캐스트가 필요하지 않습니다.

+0

감사합니다. CRD, 버그 신고서를 제출하고 회피 할 수 있습니다. –

+0

안녕하세요, ReinhardMänner가 버그 신고서를 제출하셨습니까? 링크는 무엇입니까? 우리는 iOS 8.3에서 float 값을 인코딩/디코딩하는 것과 비슷한 충돌이 발생했습니다. 감사! – Danik

+0

@ 다닉 : 2013 년 6 월 12 일에 버그 신고서를 제출했지만 답을 얻지 못했지만 아직 공개되었습니다. 참조 번호는 14126397입니다. 요청한 '링크'입니까? 또는이 보고서에 대한 링크를 얻으려면 어떻게합니까? –