2009-11-17 19 views
9

पर एन्कोडिंग/डिकोडिंग CGFloat मैं 64-बिट में एक ऐप को काम करने के लिए परिवर्तित कर रहा हूं। ऐप्पल दस्तावेज़ बताते हैं कि CGFloat प्रकार 32-बिट पर float और 64-बिट पर double है।32-बनाम 64-बिट

यदि ऐसा है, तो आप मूल्य के एन्कोडिंग/डिकोडिंग को कैसे प्रबंधित करते हैं? उदाहरण के लिए, को CGFloat से बनाते समय, क्या मुझे -numberWithFloat: या -numberWithDouble: NSNumber की विधि का उपयोग करना चाहिए? एक ही प्रश्न NSCoder और NSKeyedArchiver विधियों -encodeFloat:forKey: और -encodeDouble:forKey: पर लागू होता है।

क्या मुझे एक सशर्त मैक्रो लिखना है ताकि 0 -को 64-बिट पर 32-बिट और -numberWithDouble: पर कॉल किया जा सके?

क्या होता है यदि कोई ऐप के 64-बिट संस्करण को चलाने वाला कोई उपयोगकर्ता फ़ाइल सहेजता है जहां ये मान युगल के रूप में एन्कोड किए जाते हैं और फ़ाइल 32-बिट सिस्टम पर खोला/अनारक्षित हो जाती है?

CGFloats का उपयोग करने वाले मेरे ऐप में सभी विधियों को double के सटीक स्तर की आवश्यकता होने की संभावना नहीं है, तो क्या मुझे इसके बारे में भी चिंता करनी चाहिए?

उत्तर

12

क्या होता है यदि कोई उपयोगकर्ता ऐप के 64-बिट संस्करण को चलाने वाला फ़ाइल सहेजता है जहां ये मान युगल के रूप में एन्कोड किए जाते हैं और फ़ाइल 32-बिट सिस्टम पर खोला/अनारक्षित हो जाती है?

कुछ खास नहीं है। फ़ाइल में double है, और संभवतः आप मान प्राप्त करने के लिए decodeDouble:forKey: भेज रहे हैं, इसलिए आपको double मिल जाएगा। इसके बाद आप इसे CGFloat पर डाल सकते हैं - यदि आप 32-बिट मशीन पर हैं तो सटीकता खो जाएगी, लेकिन आपको इसे जल्द या बाद में करना होगा। (यहां तक ​​कि अगर आप double पर पकड़, आप अभी भी CGFloat को कास्ट करने के लिए जब आप क्वार्ट्ज/AppKit/UIKit को मान पास करनी होगी।)

विकल्प पर विचार करें: आप एक 64 पर फ़ाइल में float रों की दुकान बिट मशीन, और उसके बाद फ़ाइल को उसी मशीन पर वापस लोड करें। आप और क्वार्ट्ज 64-बिट double प्रकार की पूर्ण सटीकता को संभाल सकते हैं, लेकिन आपके पास यह नहीं है, क्योंकि आपने फ़ाइल को लिखा था जब आपने इसे हटा दिया था। यदि मूल्य में मूल्य बदल गया है, तो वह परिवर्तन अब स्थायी है।

तो मेरी सिफारिश, जब तक आप जानते हैं कि आप कभी नहीं लेकिन float कुछ भी का उपयोग करने जा रहे हैं हमेशा NSKeyedArchiver साथ double प्रकार का उपयोग करना है (यानी, लक्ष्य केवल API float, कभी नहीं double उपयोग करता है)। यह क्वार्ट्ज के बारे में सच नहीं है, इसलिए CGFloat के लिए, double का उपयोग करें।

+0

बहुत धन्यवाद, जो चीजों को बहुत स्पष्ट करता है। –