दिलचस्प पोस्ट
कंसल्टेंसी इन्फ़ोरी में एनएसईटी के वर्तमान कल्चर और कंटेंट यूक कृषि गुणों के बीच अंतर क्या है? JsonArray को JsonObject में जोड़ें !! सी ऑपरेटर, एक दो नहीं है? एंड्रॉइड के साथ एक फाइल डाउनलोड करें, और प्रगति डीआईएलओॉग में प्रगति दिखा रहा है Asp.net mvc के लिए Ninject और फ़िल्टर विशेषता के साथ निर्भरता इंजेक्शन JFrame पृष्ठभूमि छवि इनपुट में अप्रत्याशित वर्ण: '\' (एएससीआईआई = 92) राज्य = 1 क्या पैकेज के संस्करण को नोडजेएस कोड में मिला है? अतिव्यापी घटनाओं के साथ स्ट्रिंग गणना संकलित निष्पादन योग्य से कंपाइलर विकल्प प्राप्त करें? पिछला प्रिंट को अजगर में stdout पर कैसे ओवरराइट किया जाए? एक HTML तालिका में वर्ड-रैप एक्लेप्से में जावा: मैं फाइल सिस्टम पर कहां रखता हूं जिसे मैं getResource का उपयोग कर लोड करना चाहता हूं? (उदाहरण के लिए एक छवि आइकन के लिए चित्र) क्या कोई "डोम परिवर्तन पर" ईवेंट है? एक अहस्ताक्षरित चार क्या है?

NSInteger बनाम int का उपयोग कब करना

आईओएस के लिए विकास करते समय मुझे NSInteger vs. int का प्रयोग करना चाहिए? मैं एप्पल नमूना कोड में देखता हूं जब वे फ़ंक्शन के तर्क के रूप में एक मान को पास करते हुए या फ़ंक्शन से मान लौटते समय NSInteger (या NSUInteger ) का उपयोग करते हैं।

 - (NSInteger)someFunc;... - (void)someFuncWithInt:(NSInteger)value;... 

लेकिन किसी फ़ंक्शन के भीतर वे केवल एक मान को ट्रैक करने के लिए int का उपयोग कर रहे हैं

 for (int i; i < something; i++) ... int something; something += somethingElseThatsAnInt; ... 

मैंने पढ़ा है (बताया गया है) कि NSInteger एक 64-बिट या 32-बिट परिवेश में पूर्णांक को संदर्भित करने के लिए एक सुरक्षित तरीका है, तो क्यों बिल्कुल int उपयोग करें?

वेब के समाधान से एकत्रित समाधान "NSInteger बनाम int का उपयोग कब करना"

आप सामान्यतः NSInteger का उपयोग करना चाहते हैं जब आपको नहीं पता कि किस तरह की प्रोसेसर आर्किटेक्चर पर आपका कोड चल सकता है, तो आप किसी कारण से सबसे बड़ा संभावित int प्रकार चाहते हो, जो कि 32 बिट सिस्टम पर सिर्फ एक int , जबकि 64 बिट सिस्टम यह एक long

जब तक आप विशेष रूप से उन्हें आवश्यकता नहीं करते हैं, तब तक मैं int / long बजाय NSInteger का उपयोग कर NSInteger

NSInteger / NSUInteger को इन प्रकारों में से एक के लिए डायनामिक typedef * s के रूप में परिभाषित किया गया है, और उन्हें इस प्रकार परिभाषित किया गया है:

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

इन प्रारूपों में से प्रत्येक के लिए सही प्रारूप विनिर्देशक का उपयोग करना चाहिए, प्लेटफ़ॉर्म निर्भरता पर स्ट्रिंग प्रोग्रामिंग गाइड का अनुभाग देखें

क्यों बिल्कुल int उपयोग करें?

ऐप का उपयोग करता है क्योंकि एक लूप नियंत्रण चर के लिए (जो कि केवल लूप पुनरावृत्तियों को नियंत्रित करने के लिए प्रयोग किया जाता है) int डेटाटाइप ठीक है, दोनों डेटाटाइप आकार में और मूल्यों में जो आपके लूप के लिए हो सकता है। मंच पर निर्भर डेटाटाइप के लिए यहां कोई ज़रूरत नहीं है। एक लूप नियंत्रण चर के लिए 16-बिट int भी अधिकतर समय लगेगा।

ऐप्पल फ़ंक्शन रिटर्न वैल्यू के लिए या फ़ंक्शन तर्क के लिए NSInteger का उपयोग करता है क्योंकि इस मामले में डेटैट टाइप [साइज] के मामलों में , क्योंकि आप फ़ंक्शन के साथ क्या कर रहे हैं अन्य प्रोग्रामों या कोड के अन्य टुकड़ों के साथ डेटा संचार / पास कर रहा है; मुझे एनएसआईएनटीजी बनाम इंट का उपयोग कब होना चाहिए? अपने सवाल में ही …

फ़ंक्शन के तर्क के रूप में किसी मान को पास करने या किसी फ़ंक्शन से मान लौटाते समय वे [एपल] एनएसआईएनटेगर (या एनएसयूइंटेगर) का इस्तेमाल करते हैं।

ओएस एक्स "एलपी 64" है इस का मतलब है कि:

int हमेशा 32 बिट है

long long हमेशा 64 बिट्स होते हैं

NSInteger और long से हमेशा सूचक-आकार होते हैं इसका मतलब है कि वे 32-बिट सिस्टम पर 32 बिट्स हैं, और 64-बिट सिस्टम पर 64 बिट्स हैं।

कारण NSInteger मौजूद है क्योंकि कई लीगेसी एपीआई पॉइंटर-आकार के चर को पकड़ने के लिए long बजाय गलत इस्तेमाल करते हैं, जिसका मतलब है कि एपीआई को अपने 64-बिट संस्करणों में int से बदलना होता था। दूसरे शब्दों में, आप 32-बिट या 64-बिट आर्किटेक्चर के लिए संकलन कर रहे हैं, इसके आधार पर एक एपीआई में विभिन्न फ़ंक्शन के हस्ताक्षर होंगे। NSInteger इन विरासत एपीआई के साथ इस समस्या को मुखौटा करने का इरादा रखता है।

अपने नए कोड में, यदि आपको 32-बिट चर की आवश्यकता है, तो long long यदि आपको एक 64-बिट पूर्णांक और long या NSInteger ज़रूरत होती है, तो आपको एक सूचक-आकार वाले चर की आवश्यकता है।

यदि आप एनएसआईएनटेगर के कार्यान्वयन में खुलते हैं:

 #if __LP64__ typedef long NSInteger; #else typedef int NSInteger; #endif 

बस, NSInteger typedef आपके लिए एक कदम है: यदि वास्तुकला 32-बिट है, यह int का उपयोग करता है, अगर यह 64-बिट है, तो यह long का उपयोग करता है। NSInteger का उपयोग करते हुए, आपको उस वास्तुकला के बारे में चिंता करने की ज़रूरत नहीं है जिस पर प्रोग्राम चल रहा है।

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

इसे अधिकांश परिस्थितियों में एनएसआईएनटेगर का उपयोग करने में चोट नहीं आती है, सिवाय इसके कि यह दो बार जितनी मेमोरी लेता है। स्मृति प्रभाव बहुत छोटा है, लेकिन यदि आपके पास किसी भी समय एक संख्या में चारों ओर चलती संख्याएं हैं, तो यह ints का उपयोग करने के लिए एक अंतर बना सकता है।

यदि आप NSInteger या NSUInteger का उपयोग करते हैं, तो आप उन्हें प्रारूप में तारों का उपयोग करते समय लंबे पूर्णांक या अहस्ताक्षरित लंबे पूर्णांक में डालना चाहते हैं, क्योंकि नई एक्सकोड सुविधा एक चेतावनी देता है अगर आप एक एनएसआईएनटेगर की कोशिश करते हैं और लॉग आउट करते हैं जैसे कि उसे ज्ञात लंबाई है। आपको इसी तरह सावधानी बरतनी चाहिए जब वे इन चर के रूप में टाइप किए गए चर या तर्कों को भेजते हैं, क्योंकि आप इस प्रक्रिया में कुछ सटीकता खो सकते हैं।

संपूर्ण, यदि आप एक बार में स्मृति में सैकड़ों हजारों होने की उम्मीद नहीं कर रहे हैं, तो दो के बीच अंतर के बारे में चिंता करने की तुलना में एनएसआईटीफेयर का इस्तेमाल करना आसान है।

वर्तमान में (सितंबर 2014) I आईओएस एपीआई के आदि के साथ बातचीत करते समय NSInteger/CGFloat का प्रयोग करने की सिफारिश करता था यदि आप आर्म 64 के लिए भी अपना ऐप बना रहे हैं। इसका कारण यह है कि जब आप float , long और int प्रकार का उपयोग करते हैं, तो आपको अनपेक्षित परिणाम मिलेंगे।

उदाहरण: फ्लोट / डबल बनाम CGFLOAT

एक उदाहरण के रूप में हम UITableView प्रतिनिधि विधि tableView:heightForRowAtIndexPath: :।

केवल 32-बिट आवेदन में यह ठीक काम करेगा अगर यह इस तरह लिखा गया है:

 -(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } 

float 32-बिट मान है और 44 जो आप लौट रहे हैं वह 32-बिट मान है हालांकि, अगर हम 64-बिट आर्म 64 आर्किटेक्चर में कोड के इस भाग को संकलित करते हैं / चलाते हैं तो 44 एक 64-बिट मान होगा। एक 32-बिट मान की उम्मीद होने पर 64-बिट मान वापस करना एक अनपेक्षित पंक्ति की ऊंचाई देगा

आप CGFloat प्रकार का उपयोग करके इस समस्या को हल कर सकते हैं

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } 

यह प्रकार 32-बिट परिवेश में 32-बिट float और 64-बिट परिवेश में 64-बिट double प्रतिनिधित्व करता है। इसलिए इस प्रकार का उपयोग करते समय विधि को हमेशा संकलित / रनटाइम वातावरण की परवाह किए बिना अपेक्षित प्रकार प्राप्त होगा।

वही तरीकों के लिए सही है जो पूर्णांकों की अपेक्षा करते हैं इस तरह के तरीकों से 32-बिट परिवेश में 32-बिट int मान और 64-बिट परिवेश में एक 64-बिट long उम्मीद होगी। आप इस मामले को NSInteger टाइप करते हुए हल कर सकते हैं जो कि NSInteger रूप में कार्य करता है या long संकलन / रनटाइम एनवाइवरमेंन्ट पर आधारित है।

आईओएस पर, यदि आप int या NSInteger उपयोग करते हैं, तो फिलहाल कोई फर्क नहीं पड़ता यह अधिक मायने रखता है कि / जब आईओएस 64-बीट्स पर चलता है

सीधे शब्दों में कहें, NSInteger s 32-bit कोड (और इस प्रकार 32-बिट लंबे) में लंबे समय तक और 64-बिट कोड (64-बिट कोड में long से 64-बिट चौड़ा, लेकिन 32-बिट 32-बिट में int- बिट कोड)। long बजाय NSInteger का उपयोग करने का सबसे अधिक कारण यह है कि मौजूदा 32-बिट कोड (जो कि int एस का उपयोग करता है) को तोड़ने में नहीं है।

CGFloat का एक ही मुद्दा है: 32-बिट पर (कम से कम ओएस एक्स पर), यह float ; 64-बिट पर, यह double

अपडेट: आईफोन 5 एस, आईपैड एयर, रेटिना के साथ आईपैड मिनी, और आईओएस 7 की शुरूआत के साथ, अब आप आईओएस पर 64-बिट कोड का निर्माण कर सकते हैं।

अपडेट 2: इसके अलावा, NSInteger एस का इस्तेमाल स्विफ्ट कोड इंटरऑपरेबिलिटी के साथ होता है।

इंट = 4 बाइट (वास्तुकार का निश्चित आकार) NSInteger = आर्किटेक्ट के आकार पर निर्भर है (उदाहरण के लिए 4 बाइट वास्तुकार = 4 बाइट एनएसआईटीएयर आकार के लिए)