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


344

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

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

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

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

int something;
something += somethingElseThatsAnInt;
...

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

जवाबों:


322

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

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

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

#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

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


4
इसके अतिरिक्त, मैं कहूंगा कि NSInteger का उपयोग करना सबसे अच्छा है जब तक कि आपको विशेष रूप से int या long int की आवश्यकता न हो।
v01d

4
@ शीशम यह संभव है कि एक का उपयोग intकरना भी एक के लिए बेहतर अनुकूल होगा long। शायद आप जानते हैं कि यह एक निश्चित सीमा से अधिक नहीं होगा, और इसलिए यह लगता है कि यह केवल उपयोग करने के लिए अधिक मेमोरी-कुशल होगा int
याकूब Relkin

58
मैं इस जवाब से असहमत हूं। केवल एक चीज जिसके लिए मैं उपयोग करूंगा NSInteger, वह है और इसे निर्दिष्ट करने वाले एपीआई से मूल्यों को पारित करना। इसके अलावा, इसका इंट या लॉन्ग पर कोई फायदा नहीं है। कम से कम एक इंट या लंबे समय के साथ आप जानते हैं कि प्रिंटफ़ या इसी तरह के बयान में किस प्रारूप का उपयोग करना है।
जेरेमीपीपी

3
यदि आपको 64b सिस्टम में काम करने के दौरान लंबे समय तक स्टोर करने की आवश्यकता है और आप NSInteger का उपयोग करते हैं तो क्या होता है लेकिन अन्य उपयोगकर्ता 32b सिस्टम का उपयोग करता है? आप विफलता को नोटिस नहीं करेंगे लेकिन उपयोगकर्ता करेंगे।
एरियलकैमस

14
यह पीछे की तरफ है। हमेशा int का उपयोग करें जब तक कि आपके पास कोई विशेष कारण न हो। सरल पूर्णांक के लिए प्लेटफ़ॉर्म-विशिष्ट परिभाषित का उपयोग करना आपके कोड को पढ़ने के लिए कठिन बनाने के अलावा कुछ नहीं करता है।
ग्लेन मेनार्ड

44

आखिर क्यों इस्तेमाल करें int?

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

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

वे [Apple] NSInteger (या NSUInteger) का उपयोग तब करते हैं जब किसी मान को किसी फ़ंक्शन के तर्क के रूप में पास करते हैं या किसी फ़ंक्शन से मान लौटाते हैं


32

OS X "LP64" है। इस का मतलब है कि:

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

long long हमेशा 64-बिट है।

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

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

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


25
इतिहास हाजिर है, लेकिन सलाह भयानक है। यदि आपको 32-बिट चर उपयोग की आवश्यकता है int32_t। यदि आपको 64-बिट पूर्णांक उपयोग की आवश्यकता है int64_t। यदि आपको पॉइंटर-आकार के चर उपयोग की आवश्यकता है intptr_t
स्टीफन कैनन

5
स्टीफन, आपकी सलाह कभी int, long, या NSInteger का उपयोग नहीं करना है?
डैरेन

7
नहीं, मेरी सलाह है कि यदि आप एक निश्चित प्रकार के ज्ञात आकार की आवश्यकता चाहते हैं तो उनका उपयोग कभी न करें। <stdint.h>प्रकार के उस उद्देश्य के लिए मौजूद हैं।
स्टीफन कैनन

3
स्टीफन, मेरा जवाब "जब NSInteger बनाम int का उपयोग करने के लिए" सवाल के जवाब में था, न कि "32-बिट पूर्णांक का क्रॉस-प्लेटफ़ॉर्म टाइपनेम क्या है"। यदि कोई NSInteger और int के बीच निर्णय लेने की कोशिश कर रहा है, तो वे यह जान सकते हैं कि वे उन प्लेटफार्मों पर कितने बड़े हैं, जिनका वे समर्थन करते हैं।
डैरेन

1
ध्यान दें कि 64 बिट्स की LP64गारंटी नहीं long longहै। एक LP64प्लेटफ़ॉर्म long long128 बिट पूर्णांक हो सकता है।
स्टीफन कैनन

26

यदि आप NSInteger के कार्यान्वयन में खुदाई करते हैं:

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

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


14
आपको चिंता करने की ज़रूरत है, क्योंकि NSInteger के लिए सही प्रारूप विनिर्देशक वास्तुकला पर निर्भर है।
जेरेमीपीपी

Apple मैनुअल के अनुसार सबसे सरल तरीका सबसे बड़ी संख्यात्मक प्रकार के लिए मूल्य है long long। तो सभी संख्यात्मक प्रकार एक ही प्रकार के स्पेसियर का उपयोग करेंगे।
Eonil

6
अब फॉर्मेट करने का सबसे सरल तरीका उन्हें बॉक्सिंग करना है -NSLog("%@", @(1123));
Eonil

1
आप इसे भी डाल सकते हैं:NSLog("%li", (long)theNSInteger);
डैनियल

कास्टिंग मुझे उदास करता है
tomalbrc

9

यदि आपको NSNotFound या NSIntegerMax जैसे निरंतर मूल्यों के खिलाफ तुलना करने की आवश्यकता है, तो आपको NSIntegers का उपयोग करना चाहिए, क्योंकि ये मान 32-बिट और 64-बिट सिस्टम पर भिन्न होंगे, इसलिए सूचकांक मान, गणना और पसंद NSInteger या NSUInteger का उपयोग करें।

यह सबसे अधिक परिस्थितियों में NSInteger का उपयोग करने के लिए चोट नहीं करता है, सिवाय इसके कि यह दो बार अधिक मेमोरी लेता है। मेमोरी इफेक्ट बहुत छोटा है, लेकिन अगर आपके पास किसी भी समय एक बड़ी संख्या में इधर-उधर तैर रहे हैं, तो हो सकता है कि यह किलों का उपयोग करने के लिए भिन्न हो।

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

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


9

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

उदाहरण: FLOAT / DOUBLE बनाम CGFLOAT

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

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

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

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

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

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

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

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


क्या होगा अगर मुझे पता है कि इस विशेष चर के मूल्य में बड़ी संख्या मूल्य नहीं हो सकते हैं और मैं इंट का उपयोग करना चाहता हूं, इसलिए। क्या यह 64-बिट वातावरण में दोनों ठीक काम करेगा। मुझे लगता है कि यह भी होना चाहिए, क्योंकि मैंने इस तरह से लूप के लिए नहीं देखा है: (int i = 0; i <10; i ++) पर्यावरण की परवाह किए बिना किसी भी गलत व्यवहार को करते हुए इसे चलाया जाता है।
चंचल राज

@ चंचल राज जब तक अन्य प्रकार के कास्टिंग या रूपांतरण नहीं होते हैं या उस चर को शामिल करने वाले तृतीय-पक्ष वर्गों और विधियों के उपयोग / ओवरराइडिंग, NSInteger के बजाय एक इंट का उपयोग करना ठीक होगा।
लियोन लुसार्डी

9

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

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

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

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

अद्यतन 2: इसके अलावा, NSIntegers का उपयोग स्विफ्ट कोड इंटरऑपरेबिलिटी के साथ करता है।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.