سؤال

NSInteger/NSUInteger هي الكاكاو-تعريف بدائل العادية المدمج في أنواع.

هل هناك أي فائدة من استخدام NS* أنواع أكثر المدمج الإضافية ؟ أيهما تفضل و لماذا ؟ هي NSInteger و int نفس العرض على 32-bit / 64-bit المنصات ؟

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

المحلول

طريقة أفهمه هو أن NSInteger et al.هي العمارة آمنة إصدارات المقابلة ج أنواع.أساسا حجمها باختلاف العمارة ، ولكن NSInteger ، على سبيل المثال ، ويضمن عقد أي صالحة مؤشر البنية الحالية.

أبل توصي استخدام هذه للعمل مع نظام التشغيل OS X 10.5 و بعده ، و أبل API:s سيتم استخدامها, لذا هو بالتأكيد فكرة جيدة أن تحصل في العادة من استخدامها.فإنها تتطلب أكثر قليلا من الكتابة ، ولكن بغض النظر عن ذلك فإنه لا يبدو أن هناك أي سبب لعدم استخدامها.

نصائح أخرى

Quantisation القضايا 64 بت وقت التشغيل

في بعض الحالات قد يكون هناك سبب وجيه لاستخدام الأنواع القياسية بدلا من NSInteger:"غير متوقع" انفخ الذاكرة في نظام 64 بت.

ومن الواضح أنه إذا كان عدد صحيح هو 8 بدلا من 4 بايت, مقدار الذاكرة التي اتخذتها القيم الضعف.نظرا إلى أن ليس كل قيمة عدد صحيح ، رغم ذلك ، يجب أن عادة لا نتوقع الذاكرة من التطبيق الخاص بك إلى مضاعفة.ومع ذلك ، فإن الطريقة التي Mac OS X يخصص الذاكرة يتغير اعتمادا على مقدار الذاكرة المطلوبة.

حاليا, إذا كنت تسأل عن 512 بايت أو أقل ، malloc جولات في العديد من 16 بايت.إذا كنت تسأل عن أكثر من 512 بايت, ومع ذلك ، malloc جولات في العديد من 512 (على الأقل 1024 بايت).لنفترض ثم أن تعريف الطبقة التي-من بين أمور أخرى -- تعلن خمس NSInteger المتغيرات المثال ، على نظام 32 بت لكل سبيل المثال تحتل يقول ، 272 بايت.على نظام 64 بت, الحالات في نظرية تتطلب 544 بايت.ولكن لأن الذاكرة استراتيجية تخصيص كل في الواقع تحتل 1024 بايت (تقريبا أربعة أضعاف الزيادة).إذا كنت تستخدم عدد كبير من هذه الكائنات ، الذاكرة من التطبيق الخاص بك قد يكون أكبر بكثير مما قد نتوقع غير ذلك.إذا كنت استبدال NSInteger المتغيرات مع sint_32 المتغيرات, يمكنك فقط استخدام 512 بايت.

عندما كنت اختيار ما العددية الاستخدام, لذلك تأكد من اختيار شيء معقول.هل هناك أي سبب لماذا كنت بحاجة إلى قيمة أكبر من لك حاجة في الخاص بك 32 بت التطبيق ؟ باستخدام إصدار 64-بت عدد صحيح لحساب عدد من ثانية من غير المرجح أن تكون ضرورية...

64 بت هو في الحقيقة سبب وجود NSInteger و NSUInteger;قبل 10.5, تلك لم تكن موجودة.وهما ببساطة بأنها تتوق في 64 بت ، رجات في 32-بت:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

وبالتالي استخدامها في مكان من أكثر الأساسي C أنواع عندما تريد 'بت الأصلي' الحجم.

CocoaDev بعض مزيد من المعلومات.

أنا أفضل معيار c أسلوب الإعلانات ولكن فقط لأنني التبديل بين عدة لغات و لا يجب أن نفكر كثيرا حول هذا الموضوع لكن يبدو أنني يجب أن تبدأ في النظر في nsinteger

استيراد وتصدير البيانات إلى الملفات أو أكثر من صافي يمكنني استخدام UInt32, SInt64 الخ...

هذه هي ضمان أن تكون ذات حجم معين بغض النظر عن العمارة و المساعدة في ترقية رمز إلى منصات أخرى و اللغات التي أيضا مشاركة هذه الأنواع.

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