2013-05-28 10 views
7

पर एनएसआईएनटेगर बनाम 64-बिट आर्किटेक्चर बनाम तो, मैं यह पता लगाने की कोशिश कर रहा हूं कि मुझे एनएसआईएनटेगर बनाम int के बारे में कितना ख्याल रखना चाहिए। मेरे पास सीएस डिग्री नहीं है, इसलिए इनमें से बहुत से प्रकार के रूपांतरण तर्क बहुत अस्पष्ट हैं। जैसा कि मैं सबसे अच्छा कह सकता हूं, तर्क है "आईओएस में int के बजाय एनएसआईएनटेगर का उपयोग करें ताकि आखिरकार जब 64-बिट आईओएस निकल जाए, तो आपके चर एक पॉइंटर को स्टोर करने के लिए अभी भी सही आकार होंगे।" काफी उचित। सिवाय इसके कि मैं अपने स्याही में पॉइंटर्स को लगभग कभी नहीं संग्रहीत कर रहा हूं।आईएसओ

मान लीजिए कि मेरे पास जैक के लिए दिए गए जादू सेम की गिनती है, और एक और चीज एक बिल्ली को त्वचा के तरीकों की संख्या को संग्रहित करती है, और मैं उन्हें कार्यों के बीच गुजर रहा हूं और उन्हें कोर डेटा और जो भी लिख रहा हूं, और तो ऐप्पल 64-बिट आईओएस जारी करता है - क्या परिवर्तन? मुझे परवाह क्यों है?

इसके अलावा, अगर मैं देखभाल करते हैं, क्यों है न कि NSInteger बजाय int32_t का उपयोग कर के लिए एक तर्क? ऐसा लगता है कि है कि चीजों को अनुमान लगाने योग्य रखने का तरीका होगा।

+0

बिल्ली की त्वचा के तरीकों की संख्या 32 बिट्स से अधिक आसानी से हो सकती है। बिल्ली, यहां तक ​​कि 64 बिट्स पर्याप्त नहीं हो सकते ;-) ;-) ;-) – dasblinkenlight

+0

मैंने कभी भी एनएसआईएनटेगर के बिंदु को नहीं समझा है ... अब अगर यह एनएसओब्जेक्ट (एनएसएनंबर की तरह) था तो मैं इसे समझ सकता था ... व्यक्तिगत रूप से मैं कभी भी एनएसआईएनटेगर का उपयोग नहीं करता क्योंकि यह मेरी क्रॉस-प्लेटफार्म संगतता को नुकसान पहुंचाता है ... – Goz

+3

@dasblinkenlight - यह बिल्ली नहीं है, यह एक कुत्ता है, और यह खराब है, चमकीला नहीं है। और जब डेवलपर्स ने "int" और "छोटा" छोड़ा और फिर व्याख्या के लिए "लंबा" छोड़ा तो सी के विकास में बहुत जल्दी किया गया। और पुनरावृत्ति। और पुनरावृत्ति। और ... इसे सीधा करने का हर प्रयास एक और पूच का दुरुपयोग करने लगता है। जैसा कि मैं इसे समझता हूं, उद्देश्य-सी/कोको लोगों ने एनएसआईएनटेगर का आविष्कार किया ताकि वे अन्य प्रकार की किस्मों से स्वतंत्र, उस प्रकार के आकार को नियंत्रित कर सकें, ताकि उनकी घोषित इंटरफेस को अन्य परिभाषाओं को बदलने के लिए हानिरहित रखा जा सके (या इसके विपरीत) –

उत्तर

5

सी 99 के <stdint.h> शीर्षलेख का उपयोग करने के बारे में आपका बिंदु बिल्कुल मान्य है: ये प्रकार आपको अपने अभिन्न प्रकारों के आकार पर अधिक नियंत्रण देते हैं। NS -prefixed अभिन्न प्रकार, हालांकि, <stdint.h> के मानकीकरण की भविष्यवाणी करते हैं, इसलिए अबास्ट्रक्शन का समानांतर सेट पेश करते हैं।

मैं NS -prefixed अभिन्न प्रकार का उपयोग करें जब कोको तरीकों के साथ बातचीत। उदाहरण के लिए, यदि कोको विधि NSUinteger लौटाती है, तो मैं NSUinteger प्रकार का उपयोग करके अपना चर घोषित करता हूं।

मैं अपने कार्यक्रम में चर के लिए <stdint.h> प्रकार का उपयोग करें जब मैं संग्रहीत डेटा के आकार पर सटीक नियंत्रण की जरूरत है। कोर डेटा में समाप्त होने वाले आइटम इस श्रेणी में हैं।

जब एक अभिन्न प्रकार का आकार कोई फर्क नहीं पड़ता, उदाहरण के लिए, जब मुझे for लूप में लूप नियंत्रण चर की आवश्यकता होती है, तो मैं int का उपयोग करता हूं।

2

मेरे सिफारिश:

  • जब Obj सी कोड लिखने, NSInteger का उपयोग करें। यह तब आपके द्वारा उपयोग किए जाने वाले ढांचे के अनुरूप है। यह int से कुछ और (int64_t, long,) में एक बार बदल सकता है?)।

  • यदि सी/सी ++ कोड (पोर्टेबिलिटी) लिखना स्पष्ट रूप से NSInteger का उपयोग न करें।

यदि आपको लगता है कि आपका वेरिएबल INT_MAX से अधिक होगा (एक स्थिरांक। जाँच here) आप int64_t उपयोग कर सकते हैं (आप स्मृति वस्तुओं का हिस्सा नहीं है या long (जब आप 32/64 सा लचीला कोड लेना पसंद) आपके ऐप के 32/64 बिट संस्करणों के बीच)। जब भी आप सुनिश्चित नहीं हैं कि आपके वर्रों में शून्य मान नहीं हैं, तो हस्ताक्षर किए गए प्रकार (uintuint64_t) का उपयोग करने पर विचार करें।

आंतरिक: संकेत के लिए, int प्रयोग नहीं करते। void *