NSDictionary initWithContentsOfFile:NSDecimalNumbers를 엉망으로 만드는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/434145

문제

내 iPhone 앱에서 나는 NSDecimalNumber 일부 환율 값을 저장합니다.앱이 처음 실행될 때 웹에서 데이터를 가져온 다음 더 이상 사용되지 않게 되면 다시 데이터를 가져와서 NSDictionary;그럼 내가 사용 writeToFile:atomically:.

앱을 처음 실행하면 요금 변환 방법이 제대로 작동합니다.하지만 두 번째로 앱을 실행하면 요금이 로드됩니다. -(NSDictionary*) initWithContentsOfFile: 변환 방법이 작동을 멈추고 이상한 결과가 나타납니다.

Incriminated 메서드에서 중단점을 사용하여 디버그를 수행한 결과 요율 데이터가 다음과 같이 표시되는 것을 발견했습니다. NSCFNumber, 보다는 NSDecimalNumber.그래서 그것은 나타납니다 initWithContentsOfFile 내 개체에 올바른 클래스를 할당하지 않습니다.기록을 위해 이 개체의 실제 가치는 다음과 같습니다. description 방법은 예상 비율 값에 해당합니다.

또한 생성된 plist 파일도 확인했습니다. writeToFile:atomically:, 요율이 다음과 같이 저장되어 있음을 확인했습니다. real;이 유형이 맞는지 궁금합니다.

무슨 일이 일어나고 있는지 아시나요?

미리 감사드립니다.
다비데

도움이 되었습니까?

해결책

속성 목록은 10진수와 부동 소수점 숫자를 구분하지 않습니다.그만큼 real 요소는 부동 소수점 숫자를 보유합니다.(실제로 직렬화 자체는 단순히 NSNumber 배상 floatValue 인스턴스가 실제로 하위 클래스에 속한다는 사실을 인식하지 못합니다.이는 부동 소수점으로의 변환이 다음과 같은 경우에 발생함을 의미합니다. 생성하다 plist 데이터를 다시 읽을 때가 아닙니다.)

문자열로 저장해야 할 것 같습니다.무손실이길 바랍니다.

다른 팁

Plist는 특정 데이터 유형에서만 작동하며 NSNumber는 그 중 하나입니다.NSDecimalNumber를 원한다면 두 가지 방법이 있습니다.첫 번째는 plist를 계속 사용하고 로드 후 모든 NSNumber를 NSDecimalNumber로 변환하는 것입니다.두 번째는 데이터 저장을 위해 NSKeyedArchiver를 사용하도록 전환하는 것입니다.여기에는 더 많은 코드가 필요하지만 NSDecimalNumber를 저장하면 NSDecimalNumber를 다시 받게 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top