जवाब है ... अच्छा ... सरल। सादगी और निरंतरता, वास्तव में।
उद्देश्य-सी विधि प्रेषण के क्षण में पूरी तरह से गतिशील है। विशेष रूप से, प्रत्येक विधि प्रेषण प्रत्येक अन्य विधि प्रेषण के समान सटीक डायनेमिक विधि रिज़ॉल्यूशन बिंदु के माध्यम से जाता है। रनटाइम के दौरान, हर विधि के कार्यान्वयन में सटीक एक ही एक्सपोज़र होता है और ऑब्जेक्टिव-सी रनटाइम द्वारा प्रदान किए गए सभी एपीआई जो कि तरीकों और चयनकर्ताओं के साथ काम करते हैं, सभी विधियों में समान रूप से काम करते हैं।
जैसा कि कई ने उत्तर दिया है (यहाँ और अन्य प्रश्नों में), संकलन-समय के निजी तरीकों का समर्थन किया जाता है; यदि कोई वर्ग अपने सार्वजनिक रूप से उपलब्ध इंटरफ़ेस में एक विधि की घोषणा नहीं करता है, तो वह विधि आपके कोड के रूप में दूर तक मौजूद नहीं हो सकती है। दूसरे शब्दों में, आप अपनी परियोजना को उचित रूप से व्यवस्थित करके संकलन समय पर वांछित दृश्यता के विभिन्न संयोजनों को प्राप्त कर सकते हैं।
रनटाइम में समान कार्यक्षमता को डुप्लिकेट करने के लिए बहुत कम लाभ है। यह जटिलता और ओवरहेड की एक जबरदस्त मात्रा जोड़ देगा। और उस जटिलता के सभी के साथ, यह अभी भी सभी लेकिन सबसे आकस्मिक डेवलपर को आपके "निजी" तरीकों को निष्पादित करने से नहीं रोक पाएगा।
संपादित करें: एक धारणा जो मैंने देखी है वह यह है कि निजी संदेशों को रनटाइम के माध्यम से जाना होगा, जिसके परिणामस्वरूप संभावित रूप से बड़े ओवरहेड हो सकते हैं। क्या यह बिल्कुल सच है?
हाँ यही है। यह मानने का कोई कारण नहीं है कि किसी वर्ग का कार्यान्वयनकर्ता कार्यान्वयन में सेट किए गए सभी उद्देश्य-सी सुविधा का उपयोग नहीं करना चाहेगा, और इसका अर्थ है कि गतिशील प्रेषण अवश्य होना चाहिए। हालांकि , कोई विशेष कारण नहीं है कि निजी तरीकों को एक विशेष संस्करण द्वारा नहीं भेजा जा सकता है objc_msgSend()
, क्योंकि कंपाइलर को पता चल जाएगा कि वे निजी थे; अर्थात यह Class
संरचना में एक निजी-केवल विधि तालिका जोड़कर प्राप्त किया जा सकता है ।
इस चेक को शॉर्ट-सर्किट करने या रनटाइम को छोड़ने के लिए कोई निजी तरीका नहीं होगा?
यह रनटाइम को छोड़ नहीं सकता है, लेकिन रनटाइम को निजी तरीकों के लिए कोई भी जांच करने की आवश्यकता नहीं होगी ।
उस ने कहा, ऐसा कोई कारण नहीं है कि कोई तृतीय-पक्ष जानबूझकर objc_msgSendPrivate()
किसी वस्तु पर कॉल नहीं कर सकता , उस वस्तु के कार्यान्वयन के बाहर, और कुछ चीजें (उदाहरण के लिए केवीओ) को ऐसा करना होगा। वास्तव में, यह निजी तरीकों के चयनकर्ताओं को उपसर्ग करने या इंटरफ़ेस हेडर में उनका उल्लेख नहीं करने की तुलना में बस एक सम्मेलन और थोड़ा बेहतर होगा।
हालांकि, ऐसा करना भाषा के शुद्ध गतिशील स्वरूप को कमज़ोर कर देगा। अब हर विधि प्रेषण एक समान प्रेषण तंत्र के माध्यम से नहीं जाएगी। इसके बजाय, आपको ऐसी स्थिति में छोड़ दिया जाएगा जहां अधिकांश विधियाँ एक तरह से व्यवहार करती हैं और एक छोटा मुट्ठी भर अलग होता है।
यह रनटाइम से आगे तक फैली हुई है क्योंकि उद्देश्य-सी के निरंतर गतिशीलता के शीर्ष पर निर्मित कोको में कई तंत्र हैं। उदाहरण के लिए, कुंजी मूल्य कोडिंग और कुंजी मूल्य अवलोकन दोनों को निजी तरीकों का समर्थन करने के लिए या तो बहुत अधिक संशोधित किया जाना चाहिए - सबसे अधिक संभावना एक शोषक खामियों का निर्माण करके - या निजी तरीके असंगत होंगे।