سؤال

وأنا تحويل التطبيق إلى العمل في 64 بت. أبل مستندات الدولة أن نوع CGFloat هو float على 32 بت وdouble على 64 بت.

إذا كان الأمر كذلك، كيف تتعاملون مع ترميز / فك قيمة؟ على سبيل المثال، إذا خلق NSNumber من CGFloat، وأود أن استخدام -numberWithFloat: أو -numberWithDouble: طريقة NSNumber؟ وينطبق نفس السؤال إلى NSCoder NSKeyedArchiver و-encodeFloat:forKey: الأساليب و-encodeDouble:forKey:.

هل لديك لكتابة ماكرو مشروط لذلك يطلق التي -numberWithFloat: على 32 بت و-numberWithDouble: على 64 بت؟

وماذا يحدث إذا كان المستخدم يقوم بتشغيل إصدار 64 بت من التطبيق يحفظ الملف حيث يتم ترميز هذه القيم كما الزوجي ويتم فتح الملف / استعادتها من الأرشيف على نظام 32 بت؟

وجميع الطرق في تطبيقي أن استخدام CGFloats من غير المحتمل أن تحتاج أي وقت مضى مستوى من الدقة double، لذلك يجب أن يكون حتى يبعث على القلق حول هذا الموضوع؟

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

وماذا يحدث إذا كان المستخدم يقوم بتشغيل إصدار 64 بت من التطبيق يحفظ الملف حيث يتم ترميز هذه القيم كما الزوجي ويتم فتح الملف / استعادتها من الأرشيف على نظام 32 بت؟

لا شيء خاص. الملف يحتوي على double، ويفترض أن كنت ترسل decodeDouble:forKey: لاسترداد قيمة، لذلك عليك الحصول على double. يمكنك ثم يطرح للCGFloat والتي سوف تفقد الدقة إذا كنت على جهاز 32 بت، ولكن ما عليك فعله أن يلقي عاجلا أو آجلا. (حتى لو كنت التمسك double، فسوف لا تزال بحاجة الى المدلى بها لCGFloat عند تمرير القيمة إلى كوارتز / AppKit / UIKit).

والنظر البديل: يمكنك تخزين floats في ملف على جهاز 64 بت، ومن ثم تحميل الجزء الخلفي الملف في على نفس الجهاز. يمكنك والكوارتز التعامل مع الدقة الكاملة من نوع double 64 بت، ولكن لم يكن لديك، لأنك رمى به بعيدا عندما كتب من الملف. إذا تغيرت قيمة على الإطلاق في المدلى بها، وهذا التغيير هو الآن الدائم.

وهكذا توصيتي هي دائما استخدام نوع double مع NSKeyedArchiver، إلا إذا كنت تعرف أنك لا ذاهب الى استخدام أي شيء ولكن float (أي، وAPI الهدف يستخدم فقط float، أبدا double). هذا ليس صحيحا من الكوارتز، وذلك لCGFloat، واستخدام double.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top