인코딩/디코딩하기 영역에서 32-대 64-bit
-
20-09-2019 - |
문제
난로 변환하는 작동하는 응용 프로그램에서 64 비트입니다.Apple docs 상태 CGFloat
형 float
에서 32 비트와 double
에서 64 비트입니다.
는 경우에는,그래서 당신은 어떻게 처리하는 인코딩/디코딩의 가치입니까?예를 들어,만약 작성 NSNumber
서 CGFloat
, 해야 사용 -numberWithFloat:
나 -numberWithDouble:
방법 NSNumber?같은 질문에 적용됩 NSCoder
고 NSKeyedArchiver
방법 -encodeFloat:forKey:
고 -encodeDouble:forKey:
.
Do I have to write 조건부의 매크로도록 -numberWithFloat:
라서 32-bit/ -numberWithDouble:
64-bit?
어떻게 될 경우에는 사용자 실행되는 64 비트 버전의 앱에 저장하는 파일의 이러한 값을 인코딩되어 있으로 복식 파일을 열/보관에서 32 비트 시스템?
모든 방법들을 통해서 나를 사용하는 응용 프로그램 CGFloats
가능성이 필요한 정밀도 수준 double
, 므로 나도에 대한 걱정 이?
해결책
어떻게 될 경우에는 사용자 실행되는 64 비트 버전의 앱에 저장하는 파일의 이러한 값을 인코딩되어 있으로 복식 파일을 열/보관에서 32 비트 시스템?
특별한 것은 없습니다.파일 포함 double
, 고,아마도 당신이 보내기 decodeDouble:forKey:
값을 검색,그래서 당신을 얻을 것 double
.할 수 있습니다 다음으로 캐스팅 CGFloat
—잃게 되는 정밀도는 당신이 32 비트 컴퓨터,하지만 당신은 그렇게 캐스팅합니다.(경우에 보유 double
, 에,당신은 여전히게 캐스팅 CGFloat
할 때 값을 전달하는 석영/AppKit/UIKit.)
대안을 고려:저장할 float
s 에서 파일에서 64 비트 컴퓨터,그리고 그런 다음 로드 파일이 뒤에서 동일한 컴퓨터에 있습니다.당신 및 석영을 처리할 수 있 전체의 정밀도 64-bit double
유형,그러나 당신이 그것을 하지 않기 때문에,당신은 그것을 던졌을 때을 작성한 파일.이 값을 변경에서 모든 캐스팅에는 변화는 영원하다.
그래서 내 추천은 항상 사용 double
형 NSKeyedArchiver 지 않는 한,당신은 당신이 알고 있는 지 를 사용하려고 하지만 아무것도 float
(즉,대상 API 를 사용 float
, 결코 double
).이것은 진실하지 않의 석영을 위해,그래서 CGFloat
, 용 double
.