2011-11-02 19 views
63

मैं ऑब्जेक्टिव-सी सीखना (करने की कोशिश कर) रहा हूँ और मैं की तरह एक वाक्यांश भर में आते हैं:आईडी का अर्थ क्या है?

-(id) init; 

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

id स्वचालित रूप से ऑब्जेक्ट को पॉइंटर के रूप में अपने अधिकार में निर्दिष्ट करता है?

+20

में यह अहंकार के विपरीत है। कुछ लोगों के लिए जो 'शून्य *' –

+0

यहां प्रश्न के लिए प्रासंगिक चर्चा है: [SO प्रश्न] (http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -instead-of-id/14652187 # 14652187) – dmitri

उत्तर

79

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

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

+0

अनुपूरक: 'id 'की परिभाषा' typedef struct objc_object * id है,', इसलिए यह 'Objc' ऑब्जेक्ट पर पॉइंटर है। – zhongwuzw

17

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

कुछ अतिरिक्त संसाधन:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing

26

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

4

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

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

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

id x; 
NSString *y = x; 

प्रकार id in objective c examples के अधिक उपयोग देखें।

"आधुनिक" उद्देश्य सी में इसके अतिरिक्त "इनिट" विधियों पर "आईडी" के बजाय instancetype का उपयोग करना पसंद किया गया है। इसे बदलने के लिए एक्सकोड में एक स्वचालित रूपांतरण उपकरण भी है। instancetype के बारे में पढ़ें: Would it be beneficial to begin using instancetype instead of id?

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

जावा या सी # में हम इस

Object data = someValue; 


String name =(Object)data; 

की तरह उपयोग करते हैं लेकिन उद्देश्य सी

id data= someValue; 



NSString *name= data; 
संबंधित मुद्दे