2009-06-18 10 views
42

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

NSString *processName = [[NSProcessInfo processInfo] processName]; 
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

कौन सा एक त्रुटि उत्पन्न की तरह कुछ कर रही करने की कोशिश की, आँख बंद करके चारों ओर tinkeing के बाद, मुझे पता चला है कि यह था NSInteger लाइन है कि समस्या पैदा कर रहा था में *।

तो मुझे स्पष्ट रूप से समझ में नहीं आता कि क्या हो रहा है। मैं समझाऊंगा कि मुझे लगता है कि यह कैसे काम करता है और शायद कोई दोष को इंगित करने के लिए बहुत दयालु होगा।

वेब विकास के विपरीत, मुझे अब वेब विकास के मुकाबले स्मृति के बारे में चिंता करने के लिए की आवश्यकता है। इसलिए जब मैं एक चर बना देता हूं, तो इसे कहीं बिट मेमोरी आवंटित किया जाता है (रैम I मान लें)। को चारों ओर परिवर्तनीय करने के बजाय, मैं पर एक पॉइंटर पास करता हूं जो कि स्मृति के आसपास है। और पॉइंटर्स को के साथ वैरिएबल नाम उपसर्ग करके घोषित किया गया है *।

मान लीजिए कि मैं सही हूं, मुझे कौन सा पहेली है, मुझे एनएसआईएनटेगर के लिए ऐसा करने की ज़रूरत क्यों नहीं है?

उत्तर

68

NSInteger एक आदिम प्रकार है, जिसका अर्थ यह है कि स्थानीय रूप से स्टैक पर संग्रहीत किया जा सकता है। आपको इसे एक्सेस करने के लिए पॉइंटर का उपयोग करने की आवश्यकता नहीं है, लेकिन यदि आप चाहें तो आप कर सकते हैं। रेखा:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

एक वास्तविक चर लौटाता है, न कि इसका पता।

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier]; 

आप एक NSInteger के लिए सूचक हो सकता है यदि आप वास्तव में एक चाहते हैं: इसे ठीक करने के लिए, आपको * हटाने की जरूरत

NSInteger *pointerToProcessID = &processID; 

एम्परसेंड ऑपरेटर का पता है। यह सूचकांक में पूर्णांक के बजाय, स्मृति में चर के पते के बराबर NSInteger पर पॉइंटर सेट करता है।

+0

मुझे संदेह है कि यह एक बहुत ही आसान युक्ति होगी। धन्यवाद। – gargantuan

+2

जब मैं वेबडेव से आईफोन विकास में चला गया तो यह मेरे लिए एक बड़ा गोचा था। दूसरे को देखने के लिए एनएसएआरएआरई को शून्य से समाप्त करना सुनिश्चित करना है। –

+3

यदि आप एनएसआईएनटेगर या अन्य प्रकारों पर ऐप्पल-डबल-क्लिक करते हैं तो आप एक्सकोड में उलझन में हैं, तो आप इसकी परिभाषा में ले जा सकते हैं, जो इस मामले में होगा: टाइपपीफ int NSInteger; तो यह सब के बाद एक सादा पुराना int है। –

25

NSInteger* के साथ घोषित करने का कारण यह नहीं है क्योंकि यह कोई ऑब्जेक्ट नहीं है। एक NSInteger बस एक int या एक long है:

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

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

बेशक, आप एक NSInteger सूचक के रूप में पारित कर सकते हैं, लेकिन सबसे कार्यों बस एक NSInteger और न यह के सूचक के रूप तर्क ले।

दूसरी ओर ऑब्जेक्ट्स को पॉइंटर्स के रूप में अन्य कार्यों में ही पारित किया जा सकता है। ऐसा इसलिए है क्योंकि ऑब्जेक्ट्स में गतिशील रूप से आवंटित स्मृति होती है, और इसलिए स्टैक पर घोषित नहीं किया जा सकता है। चूंकि int या long में उनके लिए आवंटित स्मृति की निश्चित मात्रा है, यह कोई मुद्दा नहीं है।

2

एनएसआईएनटेगर int, AFAIK के लिए सिर्फ एक टाइपिफ़ है।

+1

यह हो सकता है, लेकिन हर जगह नहीं है। 64-बिट मैक ओएस एक्स सिस्टम पर, 'एनएसआईएनटेगर' को 'लम्बा' के रूप में परिभाषित किया गया है। यह कल्पना करना मुश्किल नहीं है कि यह किसी दिन आईओएस चलाने वाले आर्किटेक्चर पर सच हो सकता है। –

3

* का अर्थ है "पॉइंटर"। ऑब्जेक्ट वेरिएबल ऑब्जेक्ट में पॉइंटर रखता है, इसलिए इसमें * है; एनएसआईएनटेगर वैरिएबल में एनएसआईएनटेगर होता है, न कि एनएसआईएनटेगर के पॉइंटर, इसलिए इसमें * नहीं है। उस चर पर * डालने से आपको कम से कम एक चेतावनी मिलती है क्योंकि आप एक पॉइंटर चर में पूर्णांक डाल रहे हैं।