2012-04-23 4 views
6

उद्देश्य सी में, id सी में void * जैसा ही है? (एक सामान्य सूचक प्रकार)।उद्देश्य सी में, "आईडी" सी में "शून्य *" जैसा ही है, और प्रोग्राम आमंत्रण के दौरान कक्षा को कैसे बताता है?

यदि हां, तो जब हम

id obj = [[Fraction alloc] init]; 
[obj methodName]; 
obj = [[ComplexNumber alloc] init]; 
[obj anotherMethodName]; 

जब विधि कहा जाता है, का उपयोग क्या माध्यम से कार्यक्रम को पता है कि क्या वर्ग obj है?

+0

मुझे लगता है कि अगर यह गलत नहीं है, तो मुझे रनटाइम पर हल किया जाता है, कॉलर को एक रजिस्टर में लोड किया जाता है (ईएक्स मुझे लगता है) और फिर फ़ंक्शन को एक्क्स में लोड किया जाता है और फिर obj-c कुछ "संदेश" भेजने के लिए जांच करता है वह ऑब्जेक्ट जो विधि कॉल है (यह चुपचाप विफल हो सकता है मुझे विश्वास है) आईआईआरसी। यह थोड़ी देर हो गया है क्योंकि मैंने obj-c internals पर गड़बड़ की है/देखा है, इसलिए मैं कुछ बिंदुओं पर गलत हो सकता हूं। सभी उद्देश्यों और उद्देश्यों के लिए आप इसे शून्य * के रूप में देख सकते हैं लेकिन कुछ मामलों में कम प्रतिबंधों के साथ –

+0

[आईडी और शून्य * के बीच उद्देश्य सी अंतर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1304176/objective-c -डिफरेंस-बीच-आईडी-एंड-शून्य) –

उत्तर

5

idvoid * जैसा नहीं है। id अज्ञात प्रकार के उद्देश्य सी ऑब्जेक्ट के लिए एक सूचक है; सी # या जावा के object डेटाटाइप की तरह। एक void* कुछ भी इंगित कर सकता है; एक गैर-शून्य id एक डेटा संरचना पर इंगित करने की उम्मीद है जो सभी ओबीजेसी वस्तुओं के लिए आम है और इसमें उनके संबंधित वर्ग डेटा के लिए एक सूचक शामिल है।

ओबीजेसी रनटाइम - alloc/init/आदि का कार्यान्वयन। - सुनिश्चित करता है कि सभी वैध वस्तुओं में उनके पास सही वर्ग सूचक है।

IIRC, एप्पल के कार्यान्वयन में सूचक आकार चर पर id अंक वर्ग के लिए सूचक है कि, वास्तव में,।

कक्षा 'डेटा ब्लॉक में, विधियों की एक सूची है जो विधि कार्यान्वयन के लिए फ़ंक्शन पॉइंटर को विधि हस्ताक्षर मैप करती है। वहां से, यह एक साधारण सरल लुकअप है जो रन टाइम में होता है जब आप किसी ऑब्जेक्ट को संदेश भेजते हैं (i। ई। किसी विधि को कॉल करें)। आधार वर्ग के लिए एक सूचक भी ताकि विधि लुकअप विरासत के पेड़ को जारी रख सके।

कि, वैसे, एक शून्य सूचक को हटाना क्यों एक संकलक त्रुटि है id पर संदेश भेजते समय कानूनी रूप से असुरक्षित है।

+1

सी # और जावा में यह वही वस्तु नहीं है, एनएसओब्जेक्ट वही है। आईडी संकलक को बताने का एक तरीका है, मैं इस ऑब्जेक्ट के साथ गतिशील टाइपिंग का उपयोग करने जा रहा हूं, आईडी जावास्क्रिप्ट में var के बराबर है। –

1

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

[myObject class]myObject की कक्षा वापस करेगा। [myObject isMemberOfClass:[SomeClass class]]BOOL लौटाएगा जो व्हाइटर आईआर myObject कक्षा SomeClass का सदस्य है।

यदि आपका कोड myObject पर कोई विधि कॉल करता है, तो रनटाइम कॉल करने का प्रयास करेगा, भले ही ऑब्जेक्ट उस विधि का जवाब न दे। यदि myObject उस विधि को लागू नहीं करता है, तो रनटाइम अपवाद होगा।

आप यह जानने के लिए myObject से भी पूछ सकते हैं कि यह विधि [myObject respondsToSelector:@selector(myCoolMethod)] के साथ मान्य है या नहीं।

5

id उद्देश्य-सी में सी 0 में void * के समान नहीं है।

एप्पल के "ऑब्जेक्टिव-सी प्रोग्रामिंग भाषा" से:

typedef struct objc_object { 
    Class isa; 
} *id; 

जिसका मतलब है, id एक objc_object संरचना, जो void के लिए सूचक से अलग है के लिए सूचक है।

हर वस्तु इस प्रकार एक isa चर है कि यह क्या वर्ग यह एक उदाहरण है के बारे में बताती है। चूंकि Class प्रकार को पॉइंटर के रूप में घोषित किया गया है।

typedef struct objc_class *Class; 

और के बारे में, कैसे इस कार्यक्रम विधि मंगलाचरण के दौरान वर्ग बता सकते हैं?, यहाँ एक ही प्रोग्रामिंग गाइड से यह वह जगह है ऊपर उद्धृत:

isa उदाहरण चर वस्तु की तरह यह है, क्या वस्तु की वर्ग को पहचानती है। एक ही व्यवहार (विधियों) और के साथ ऑब्जेक्ट्स समान प्रकार के डेटा (आवृत्ति चर) एक ही कक्षा के सदस्य हैं।

ऑब्जेक्ट्स गतिशील रूप से रनटाइम पर टाइप किए गए हैं। जब भी इसे की आवश्यकता होती है, तो रनटाइम सिस्टम सटीक कक्षा को पा सकता है कि ऑब्जेक्ट केवल ऑब्जेक्ट पूछकर से संबंधित है। (क्रम के बारे में अधिक जानने के लिए, ऑब्जेक्टिव-सी रनटाइम प्रोग्रामिंग गाइड।)

गाइड, id, nil के अनुसार, और ऑब्जेक्टिव-सी के अन्य बुनियादी प्रकार हेडर फाइल objc/objc.h में परिभाषित कर रहे हैं ।

संबंधित मुद्दे