id
void *
जैसा नहीं है। id
अज्ञात प्रकार के उद्देश्य सी ऑब्जेक्ट के लिए एक सूचक है; सी # या जावा के object
डेटाटाइप की तरह। एक void*
कुछ भी इंगित कर सकता है; एक गैर-शून्य id
एक डेटा संरचना पर इंगित करने की उम्मीद है जो सभी ओबीजेसी वस्तुओं के लिए आम है और इसमें उनके संबंधित वर्ग डेटा के लिए एक सूचक शामिल है।
ओबीजेसी रनटाइम - alloc
/init
/आदि का कार्यान्वयन। - सुनिश्चित करता है कि सभी वैध वस्तुओं में उनके पास सही वर्ग सूचक है।
IIRC, एप्पल के कार्यान्वयन में सूचक आकार चर पर id
अंक वर्ग के लिए सूचक है कि, वास्तव में,।
कक्षा 'डेटा ब्लॉक में, विधियों की एक सूची है जो विधि कार्यान्वयन के लिए फ़ंक्शन पॉइंटर को विधि हस्ताक्षर मैप करती है। वहां से, यह एक साधारण सरल लुकअप है जो रन टाइम में होता है जब आप किसी ऑब्जेक्ट को संदेश भेजते हैं (i। ई। किसी विधि को कॉल करें)। आधार वर्ग के लिए एक सूचक भी ताकि विधि लुकअप विरासत के पेड़ को जारी रख सके।
कि, वैसे, एक शून्य सूचक को हटाना क्यों एक संकलक त्रुटि है id
पर संदेश भेजते समय कानूनी रूप से असुरक्षित है।
स्रोत
2012-04-23 01:55:10
मुझे लगता है कि अगर यह गलत नहीं है, तो मुझे रनटाइम पर हल किया जाता है, कॉलर को एक रजिस्टर में लोड किया जाता है (ईएक्स मुझे लगता है) और फिर फ़ंक्शन को एक्क्स में लोड किया जाता है और फिर obj-c कुछ "संदेश" भेजने के लिए जांच करता है वह ऑब्जेक्ट जो विधि कॉल है (यह चुपचाप विफल हो सकता है मुझे विश्वास है) आईआईआरसी। यह थोड़ी देर हो गया है क्योंकि मैंने obj-c internals पर गड़बड़ की है/देखा है, इसलिए मैं कुछ बिंदुओं पर गलत हो सकता हूं। सभी उद्देश्यों और उद्देश्यों के लिए आप इसे शून्य * के रूप में देख सकते हैं लेकिन कुछ मामलों में कम प्रतिबंधों के साथ –
[आईडी और शून्य * के बीच उद्देश्य सी अंतर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1304176/objective-c -डिफरेंस-बीच-आईडी-एंड-शून्य) –