आईडी का अर्थ क्या है?


97

मैं ऑब्जेक्टिव-सी सीख रहा हूं (मैं कोशिश कर रहा हूं)

-(id) init;

और मैं समझता हूं कि idएक ऑब्जेक्टिव सी लैंग्वेज कीवर्ड है, लेकिन यह कहने का क्या मतलब है कि "कंपाइलर विशेष idरूप से पॉइंटर टाइप कन्वर्जन नियमों के संदर्भ में व्यवहार करता है"?

क्या idएक संकेतक के रूप में स्वचालित रूप से वस्तु को उसके अधिकार में नामित करता है ?


28
यह अहंकार के विपरीत है। कुछ लोगों के लिएvoid*
हॉट लिक्स

यहाँ एक प्रश्न के लिए प्रासंगिक चर्चा है: SO प्रश्न
dmitri

जवाबों:


122

idकिसी भी प्रकार के लिए एक संकेतक है, लेकिन इसके विपरीत void *हमेशा एक ऑब्जेक्टिव-सी ऑब्जेक्ट को इंगित करता है। उदाहरण के लिए, आप प्रकार के कुछ भी जोड़ सकते हैं idएक NSArray करने के लिए, लेकिन उन वस्तुओं का जवाब देना होगा retainऔर release

संकलक आपके लिए पूरी तरह से खुश है कि आप किसी भी वस्तु को किसी भी वस्तु में डाल सकें id, और आपके idलिए किसी भी वस्तु को डाल सकें। यह ऑब्जेक्टिव-सी में किसी भी अन्य अंतर्निहित कास्टिंग के विपरीत है, और कोको में अधिकांश कंटेनर प्रकारों के लिए आधार है।


11
अनुपूरक: id की परिभाषा है typedef struct objc_object *id;, इसलिए यह किसी Objcवस्तु को इंगित करता है ।
१४:५४

क्या यह वैसा ही है NSObject? इसका मतलब यह है कि क्या मैं रिटर्न प्रकार के idसाथ बदल सकता हूं NSObject?
थंडरवर्ल्ड


33

idकिसी भी उद्देश्य-सी वस्तु ( objc_object) के लिए एक संकेतक है । यह सिर्फ एक शून्य सूचक नहीं है और आपको इसका इलाज नहीं करना चाहिए। यह एक ऑब्जेक्ट को संदर्भित करता है जिसमें एक वैध isaसूचक होना चाहिए । जिन मूल्यों को संग्रहीत किया जा सकता है, idवे भी सिर्फ NSObjectऔर उसके वंशजों तक ही सीमित नहीं हैं , जो NSObjectप्रोटोकॉल के अस्तित्व के साथ-साथ उस NSProxyवर्ग के बारे में भी समझ में आने लगता है जो इससे विरासत में भी नहीं मिलता है NSObject। संकलक आपको idकिसी भी प्रकार के ऑब्जेक्ट द्वारा संदर्भित ऑब्जेक्ट को असाइन करने की अनुमति देगा , किसी भी ऑब्जेक्ट प्रकार को असाइन करें id, साथ ही इसे किसी भी संदेश (जिसे कंपाइलर ने देखा है) को बिना चेतावनी के भेजें।


25

idएक सामान्य प्रकार है। इसका मतलब यह है कि संकलक वहां किसी भी प्रकार की वस्तु की अपेक्षा करेगा , और प्रतिबंधों को लागू नहीं करेगा। यह उपयोगी हो सकता है अगर आप वस्तुओं के एक से अधिक वर्ग का उपयोग करने की उम्मीद कर रहे हैं; फिर आप आत्मनिरीक्षण का उपयोग यह पता लगाने के लिए कर सकते हैं कि यह किस वर्ग का है। idस्वचालित रूप से एक पॉइंटर ग्रहण करता है, क्योंकि ऑब्जेक्टिव-सी में सभी ऑब्जेक्ट्स पॉइंटर्स / रेफरेंस के रूप में पास किए जाते हैं।

कुछ अतिरिक्त संसाधन:
आईडी बनाम NSObject बनाम आईडी *
उद्देश्य-सी प्रोग्रामिंग (विकीबूक)
आत्मनिरीक्षण
गतिशील टाइपिंग


9
  • आईडी ऑब्जेक्टिव-सी में एक डेटा प्रकार की ऑब्जेक्ट आइडेंटिफ़ायर है, जिसका उपयोग किसी भी प्रकार की वस्तु के लिए किया जा सकता है, चाहे वह किसी भी वर्ग की हो। आईडी सभी वस्तुओं का अंतिम सुपर प्रकार है।

जावा या सी # में हम इस तरह का उपयोग करते हैं

 Object data = someValue;


 String name =(Object)data;

लेकिन उद्देश्य में सी

id data= someValue;



NSString *name= data;

5

हां और ना। यह सच है कि id xएक्स को एक पॉइंटर के रूप में नामित किया गया है, लेकिन यह कहना कि पॉइंटर टाइप रूपांतरण नियम लागू करना गलत है, क्योंकि "आईडी" में विशेष प्रकार के रूपांतरण नियम हैं। उदाहरण के लिए, एक void *पॉइंटर के साथ आप ऐसा नहीं कर सकते:

void *x;
char *y = x; // error, this needs an explicit cast

इसके विपरीत, यह आईडी के साथ संभव है:

id x;
NSString *y = x;

ऑब्जेक्टिव c उदाहरणों में टाइप आईडी का अधिक उपयोग देखें ।

"आधुनिक" ऑब्जेक्टिव C के अलावा instancetype"init" विधियों पर "id" के बजाय इसका उपयोग करना पसंद किया जाता है। इसे बदलने के लिए Xcode में एक स्वचालित रूपांतरण उपकरण भी है। इंस्टेंटाइप के बारे में पढ़ें: क्या आईडी के बजाय इंस्टेंटाइप का उपयोग शुरू करना फायदेमंद होगा?

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