ऑब्जेक्टिव-सी: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(23 intermediate revisions by 5 users not shown)
Line 24: Line 24:
| wikibooks = Objective-C Programming
| wikibooks = Objective-C Programming
}}
}}
ऑब्जेक्टिव-सी एक [[सामान्य प्रयोजन [[प्रोग्रामिंग भाषा]]]] है। सामान्य-उद्देश्य, [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]|ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज जो [[सी (प्रोग्रामिंग भाषा)]] में स्मॉलटॉक-स्टाइल [[संदेश देना]] करती है।<ref name=":0" />प्रोग्रामिंग भाषा। मूल रूप से 1980 के दशक की शुरुआत में ब्रैड कॉक्स और टॉम लव द्वारा विकसित किया गया था, इसे [[NeXT]] द्वारा अपने [[NeXTSTEP]] ऑपरेटिंग सिस्टम के लिए चुना गया था। Apple Inc. [[macOS]] की NeXTSTEP से सीधी वंशावली के कारण,<ref>{{cite web|url= http://osxbook.com/book/bonus/ancient/whatismacosx/history.html|title=A Brief History of Mac OS X|last=Singh|first=Amit|date=December 2003|publisher=Mac OS X Internals|access-date=June 11, 2012|archive-url=https://web.archive.org/web/20120514135706/http://osxbook.com/book/bonus/ancient/whatismacosx/history.html|archive-date=May 14, 2012|url-status=live}}</ref> ऑब्जेक्टिव-सी, [[स्विफ्ट (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा की शुरूआत तक macOS और [[iOS]] एप्लिकेशन (उनके संबंधित [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]], [[कोको (एपीआई)]] और [[कोको टच]] के माध्यम से) विकसित करने के लिए Apple द्वारा उपयोग की जाने वाली, समर्थित और प्रचारित मानक प्रोग्रामिंग भाषा थी। 2014 में।<ref name=":0">{{cite web|url=https://developer.apple.com/documentation#app-frameworks|title=App Frameworks|date=June 2014|publisher=Apple|access-date=February 13, 2019|archive-url=https://web.archive.org/web/20190216075924/https://developer.apple.com/documentation/#app-frameworks|archive-date=February 16, 2019|url-status=live}}</ref>
'''ऑब्जेक्टिव-सी''' सामान्य प्रयोजन [[प्रोग्रामिंग भाषा]] है। सामान्य-उद्देश्य, [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]भाषा है जो [[सी (प्रोग्रामिंग भाषा)]] में स्मॉलटॉक-स्टाइल [[संदेश देना]] करती है।<ref name=":0" /> प्रोग्रामिंग भाषा। मूल रूप से 1980 के दशक की प्रारंभ में ब्रैड कॉक्स और टॉम लव द्वारा विकसित किया गया था, इसे [[NeXT|नेक्स्ट]] द्वारा अपने [[NeXTSTEP|नेक्स्ट स्टेप]] ऑपरेटिंग प्रणाली के लिए चुना गया था। एप्पल आई एन सी. [[macOS|मैक ओएस]] की नेक्स्ट स्टेप से सीधी वंशावली के कारण,<ref>{{cite web|url= http://osxbook.com/book/bonus/ancient/whatismacosx/history.html|title=A Brief History of Mac OS X|last=Singh|first=Amit|date=December 2003|publisher=Mac OS X Internals|access-date=June 11, 2012|archive-url=https://web.archive.org/web/20120514135706/http://osxbook.com/book/bonus/ancient/whatismacosx/history.html|archive-date=May 14, 2012|url-status=live}}</ref> ऑब्जेक्टिव-सी, [[स्विफ्ट (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा की प्रारंभ तक मैक ओएस और [[iOS|आईओएस]] एप्लिकेशन (उनके संबंधित [[अप्लिकेशन प्रोग्रामिंग अंतरफलक|एप्लिकेशन प्रोग्रामिंग अंतरफलक]], [[कोको (एपीआई)]] और [[कोको टच]] के माध्यम से) विकसित करने के लिए एप्पल द्वारा उपयोग की जाने वाली, समर्थित और प्रचारित मानक प्रोग्रामिंग भाषा थी।<ref name=":0">{{cite web|url=https://developer.apple.com/documentation#app-frameworks|title=App Frameworks|date=June 2014|publisher=Apple|access-date=February 13, 2019|archive-url=https://web.archive.org/web/20190216075924/https://developer.apple.com/documentation/#app-frameworks|archive-date=February 16, 2019|url-status=live}}</ref>
गैर-एप्पल ऑपरेटिंग सिस्टम के लिए विकसित ऑब्जेक्टिव-सी प्रोग्राम या जो ऐप्पल के एपीआई पर निर्भर नहीं हैं, उन्हें [[जीएनयू]] [[जीएनयू संकलक संग्रह]] या [[एलएलवीएम]]/क्लैंग द्वारा समर्थित किसी भी [[कंप्यूटर मंच]] के लिए भी संकलित किया जा सकता है।


उद्देश्य-सी स्रोत कोड 'मैसेजिंग/कार्यान्वयन' प्रोग्राम फ़ाइलें आमतौर पर होती हैं {{mono|.m}} फ़ाइल नाम एक्सटेंशन, जबकि ऑब्जेक्टिव-सी 'हेडर/इंटरफ़ेस' फ़ाइलें हैं {{mono|.h}} एक्सटेंशन, सी हेडर फाइलों के समान। ऑब्जेक्टिव-सी++ फाइलों को a से निरूपित किया जाता है {{mono|.mm}} फाइल एक्सटेंशन।
2014 में गैर-एप्पल ऑपरेटिंग प्रणाली के लिए विकसित ऑब्जेक्टिव-सी प्रोग्राम या जो ऐप्पल के एपीआई पर निर्भर नहीं हैं, उन्हें [[जीएनयू]] [[जीएनयू संकलक संग्रह]] या [[एलएलवीएम]] क्लैंग द्वारा समर्थित किसी भी [[कंप्यूटर मंच]] के लिए भी संकलित किया जा सकता है।
 
उद्देश्य-सी स्रोत कोड 'मैसेजिंग कार्यान्वयन' प्रोग्राम फ़ाइलें सामान्यतः होती हैं {{mono|.एम}} फ़ाइल नाम एक्सटेंशन है, जबकि ऑब्जेक्टिव-सी 'हेडर इंटरफ़ेस' फ़ाइलें हैं {{mono|.एच}} एक्सटेंशन, सी हेडर फाइलों के समान है। ऑब्जेक्टिव- {{mono|.एम एम}} फाइल एक्सटेंशन और सी++ फाइलों को से निरूपित किया जाता है।


== इतिहास ==
== इतिहास ==
ऑब्जेक्टिव-सी मुख्य रूप से [[ब्रैड कॉक्स]] और टॉम लव द्वारा 1980 के दशक की शुरुआत में उनकी कंपनी [[कदम पत्थर]] | प्रोडक्टिविटी प्रोडक्ट्स इंटरनेशनल (पीपीआई) में बनाया गया था।<ref name=Wired1>{{cite magazine|last=Garling|first=Caleb|title=iPhone Coding Language Now World's Third Most Popular|url=https://www.wired.com/wiredenterprise/2012/07/apple-objective-c/|magazine=[[Wired (magazine)|Wired]]|access-date=May 20, 2013|archive-url=https://web.archive.org/web/20130909060247/http://www.wired.com/wiredenterprise/2012/07/apple-objective-c/|archive-date=September 9, 2013|url-status=live}}</ref>
ऑब्जेक्टिव-सी मुख्य रूप से [[ब्रैड कॉक्स]] और टॉम लव द्वारा 1980 के दशक की प्रारंभ में उनकी कंपनी [[कदम पत्थर]] | प्रोडक्टिविटी प्रोडक्ट्स इंटरनेशनल (पीपीआई) में बनाया गया था।<ref name=Wired1>{{cite magazine|last=Garling|first=Caleb|title=iPhone Coding Language Now World's Third Most Popular|url=https://www.wired.com/wiredenterprise/2012/07/apple-objective-c/|magazine=[[Wired (magazine)|Wired]]|access-date=May 20, 2013|archive-url=https://web.archive.org/web/20130909060247/http://www.wired.com/wiredenterprise/2012/07/apple-objective-c/|archive-date=September 9, 2013|url-status=live}}</ref>
अपनी कंपनी के निर्माण के लिए अग्रणी, दोनों को 1981 में [[ITT Corporation]] के प्रोग्रामिंग टेक्नोलॉजी सेंटर में रहते हुए स्मॉलटाक से परिचित कराया गया था। ऑब्जेक्टिव-सी पर सबसे पहला काम उसी समय के आसपास का है।<ref>{{Cite book
 
अपनी कंपनी के निर्माण के लिए अग्रणी, दोनों को 1981 में [[ITT Corporation|आई.टी.टी कॉर्पोरेशन]] के प्रोग्रामिंग टेक्नोलॉजी सेंटर में रहते हुए स्मॉलटाक से परिचित कराया गया था। ऑब्जेक्टिव-सी पर सबसे पहला काम उसी समय के आसपास का है।<ref>{{Cite book
  |last= Wentk
  |last= Wentk
  |first= Richard
  |first= Richard
Line 43: Line 45:
  |archive-date= February 16, 2017
  |archive-date= February 16, 2017
  |url-status= live
  |url-status= live
  }}</ref> [[सॉफ्टवेयर इंजीनियरिंग]] और प्रोग्रामिंग में वास्तविक पुन: प्रयोज्यता की समस्याओं से कॉक्स को परेशान किया गया था। उन्होंने महसूस किया कि आईटीटी में सिस्टम डेवलपर्स के लिए विकास के वातावरण के निर्माण में स्मॉलटाक जैसी भाषा अमूल्य होगी। हालांकि, उन्होंने और टॉम लव ने यह भी माना कि आईटीटी के टेलीकॉम इंजीनियरिंग परिवेश में सी के साथ पश्चगामी संगतता गंभीर रूप से महत्वपूर्ण थी।<ref name=love2009>{{Cite book
  }}</ref> [[सॉफ्टवेयर इंजीनियरिंग]] और प्रोग्रामिंग में वास्तविक पुन: प्रयोज्यता की समस्याओं से कॉक्स को परेशान किया गया था। उन्होंने अनुभव किया कि आईटीटी में प्रणाली डेवलपर्स के लिए विकास के वातावरण के निर्माण में स्मॉलटाक जैसी भाषा अमूल्य होगी। चुकी, उन्होंने और टॉम लव ने यह भी माना कि आईटीटी के टेलीकॉम इंजीनियरिंग परिवेश में सी के साथ पश्चगामी संगतता गंभीर रूप से महत्वपूर्ण थी।<ref name="love2009">{{Cite book
  |last1= Biancuzzi
  |last1= Biancuzzi
  |first1= Federico
  |first1= Federico
Line 59: Line 61:
  |url-status= live
  |url-status= live
  }}</ref>
  }}</ref>
कॉक्स ने स्मॉलटाक की कुछ क्षमताओं को जोड़ने के लिए सी (प्रोग्रामिंग भाषा) के लिए प्री-प्रोसेसर लिखना शुरू किया। जल्द ही उनके पास C (प्रोग्रामिंग लैंग्वेज) लैंग्वेज के लिए एक ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन का कार्य कार्यान्वयन था, जिसे उन्होंने ऑब्जेक्ट-ओरिएंटेड प्री-कंपाइलर के लिए OOPC कहा।<ref>{{Cite journal
 
कॉक्स ने स्मॉलटाक की कुछ क्षमताओं को जोड़ने के लिए सी (प्रोग्रामिंग भाषा) के लिए प्री-प्रोसेसर लिखना प्रारंभ किया। जल्द ही उनके पास सी (प्रोग्रामिंग भाषा) भाषा के लिए ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन का कार्य कार्यान्वयन था, जिसे उन्होंने ऑब्जेक्ट-ओरिएंटेड प्री-कंपाइलर के लिए ओओपीसी कहा।<ref>{{Cite journal
  |last= Cox
  |last= Cox
  |first= Brad
  |first= Brad
Line 75: Line 78:
  |access-date= February 17, 2011}}
  |access-date= February 17, 2011}}
</ref>
</ref>
लव को 1982 में श्लम्बरगर रिसर्च द्वारा काम पर रखा गया था और उन्हें स्मॉलटाक -80 की पहली व्यावसायिक प्रति प्राप्त करने का अवसर मिला, जिसने उनके दिमाग की उपज के विकास को और प्रभावित किया। यह प्रदर्शित करने के लिए कि वास्तविक प्रगति की जा सकती है, कॉक्स ने दिखाया कि विनिमेय सॉफ़्टवेयर घटकों को वास्तव में मौजूदा उपकरणों में केवल कुछ व्यावहारिक परिवर्तनों की आवश्यकता है। विशेष रूप से, उन्हें लचीले तरीके से वस्तुओं का समर्थन करने की आवश्यकता होती है, पुस्तकालयों के उपयोग योग्य सेट के साथ आपूर्ति की जाती है, और कोड (और कोड द्वारा आवश्यक किसी भी संसाधन) को एक क्रॉस-प्लेटफ़ॉर्म प्रारूप में बंडल करने की अनुमति देता है।


लव एंड कॉक्स ने अंततः अपने उत्पाद का व्यावसायीकरण करने के लिए पीपीआई का गठन किया, जिसमें एक ऑब्जेक्टिव-सी कंपाइलर को क्लास लाइब्रेरी के साथ जोड़ा गया। 1986 में, कॉक्स ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, एक विकासवादी दृष्टिकोण पुस्तक में ऑब्जेक्टिव-सी का मुख्य विवरण अपने मूल रूप में प्रकाशित किया। यद्यपि वह यह इंगित करने के लिए सावधान था कि उद्देश्य-सी प्रदान करने की तुलना में पुन: प्रयोज्यता की समस्या के लिए और भी कुछ है, भाषा अक्सर अन्य भाषाओं के साथ फीचर के लिए फीचर की तुलना करती है।
लव को 1982 में श्लम्बरगर रिसर्च द्वारा काम पर रखा गया था और उन्हें स्मॉलटाक -80 की पहली व्यावसायिक प्रति प्राप्त करने का अवसर मिला, जिसने उनके दिमाग की उपज के विकास को और प्रभावित किया। यह प्रदर्शित करने के लिए कि वास्तविक प्रगति की जा सकती है, कॉक्स ने दिखाया कि विनिमेय सॉफ़्टवेयर घटकों को वास्तव में वर्त्तमान उपकरणों में केवल कुछ व्यावहारिक परिवर्तनों की आवश्यकता है। विशेष रूप से, उन्हें लचीले विधियों से वस्तुओं का समर्थन करने की आवश्यकता होती है, पुस्तकालयों के उपयोग योग्य सेट के साथ आपूर्ति की जाती है, और कोड (और कोड द्वारा आवश्यक किसी भी संसाधन) को क्रॉस-प्लेटफ़ॉर्म प्रारूप में बंडल करने की अनुमति देता है।
 
लव एंड कॉक्स ने अंततः अपने उत्पाद का व्यावसायीकरण करने के लिए पीपीआई का गठन किया, जिसमें ऑब्जेक्टिव-सी कंपाइलर को क्लास लाइब्रेरी के साथ जोड़ा गया। 1986 में, कॉक्स ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, विकासवादी दृष्टिकोण पुस्तक में ऑब्जेक्टिव-सी का मुख्य विवरण अपने मूल रूप में प्रकाशित किया। यद्यपि वह यह इंगित करने के लिए सावधान था कि उद्देश्य-सी प्रदान करने की तुलना में पुन: प्रयोज्यता की समस्या के लिए और भी कुछ है, भाषा अधिकांशतः अन्य भाषाओं के साथ विशेषता के लिए विशेषता की तुलना करती है।
 
=== नेक्स्ट के माध्यम से लोकप्रियता ===
1988 में, नेक्स्ट ने स्टेपस्टोन (पीपीआई का नया नाम, ऑब्जेक्टिव-सी ट्रेडमार्क का स्वामी) से ऑब्जेक्टिव-सी लाइसेंस प्राप्त किया और ऑब्जेक्टिव-सी का समर्थन करने के लिए जीएनयू कंपाइलर कलेक्शन कंपाइलर का विस्तार किया। नेक्स्ट ने [[आवेदन किट]] और [[फाउंडेशन किट]] लाइब्रेरी विकसित की, जिस पर नेक्स्टस्टेप यूजर इंटरफेस और इंटरफेस बिल्डर आधारित थे। जबकि नेक्स्ट वर्कस्टेशन बाज़ार में बड़ा प्रभाव बनाने में विफल रहे, उद्योग में उपकरणों की व्यापक रूप से सराहना की गई। इसने नेक्स्ट को हार्डवेयर उत्पादन को छोड़ने और सॉफ्टवेयर उपकरण्स पर ध्यान केंद्रित करने, कस्टम प्रोग्रामिंग के लिए मंच के रूप में नेक्स्टस्टेप (और ओपनस्टेप) को बेचने का नेतृत्व किया।
 
[[GPL|जीपीएल]] की नियमो को किनारे करने के लिए, नेक्स्ट मूल रूप से ऑब्जेक्टिव-सी फ्रंटएंड को अलग से शिप करने का प्रयोजन रखता था, जिससे उपयोगकर्ता इसे जीसीसी के साथ लिंक करके कंपाइलर निष्पादन योग्य बना सके। चुकी प्रारंभ में रिचर्ड एम. स्टॉलमैन द्वारा स्वीकार किया गया था, स्टॉलमैन द्वारा जीएनयू के वकीलों के साथ परामर्श करने के बाद इस योजना को अस्वीकार कर दिया गया था और नेक्स्ट ने ऑब्जेक्टिव-सी को जीसीसी का भाग बनाने पर सहमति व्यक्त की थी।<ref>{{cite web|url=https://github.com/JoshCheek/clisp/blob/master/doc/Why-CLISP-is-under-GPL|title=Common Lisp and Readline|website=[[GitHub]] |quote=The issue first arose when NeXT proposed to distribute a modified GCC in two parts and let the user link them.  Jobs asked me whether this was lawful.  It seemed to me at the time that it was, following reasoning like what you are using; but since the result was very undesirable for free software, I said I would have to ask the lawyer.  What the lawyer said surprised me; he said that judges would consider such schemes to be "subterfuges" and would be very harsh toward them.  He said a judge would ask whether it is "really" one program, rather than how it is labeled.  So I went back to Jobs and said we believed his plan was not allowed by the GPL.  The direct result of this is that we now have an Objective C front end.  They had wanted to distribute the Objective C parser as a separate proprietary package to link with the GCC back end, but since I didn't agree this was allowed, they made it free.|access-date=September 15, 2014|archive-url=https://web.archive.org/web/20140906185259/http://clisp.cvs.sourceforge.net/viewvc/clisp/clisp/doc/Why-CLISP-is-under-GPL|archive-date=September 6, 2014|url-status=live}}</ref>


=== नेक्स्ट === के माध्यम से लोकप्रियता
जीएनयू कंपाइलर संग्रह का विस्तार करने का काम स्टीव नारॉफ के नेतृत्व में किया गया था, जो स्टेपस्टोन से नेक्स्ट में सम्मिलित हुए थे। [[जीएनयू पब्लिक लाइसेंस]] लाइसेंस नियमो के अनुसार संकलक परिवर्तन उपलब्ध कराए गए थे, लेकिन रनटाइम पुस्तकालय नहीं थे, जो खुले स्रोत के योगदान को सामान्य जनता के लिए अनुपयोगी बना रहे थे। इसने अन्य पार्टियों को ओपन सोर्स लाइसेंस के अनुसार ऐसी रनटाइम लाइब्रेरी विकसित करने के लिए प्रेरित किया। बाद में, क्लैंग के लिए ऑब्जेक्टिव-सी फ्रंटएंड बनाने के लिए एप्पल में काम करने के लिए स्टीव नारॉफ का भी प्रमुख योगदान था।
1988 में, नेक्स्ट ने स्टेपस्टोन (पीपीआई का नया नाम, ऑब्जेक्टिव-सी ट्रेडमार्क का मालिक) से ऑब्जेक्टिव-सी लाइसेंस प्राप्त किया और ऑब्जेक्टिव-सी का समर्थन करने के लिए जीएनयू कंपाइलर कलेक्शन कंपाइलर का विस्तार किया। NeXT ने [[आवेदन किट]] और [[फाउंडेशन किट]] लाइब्रेरी विकसित की, जिस पर NeXTSTEP यूजर इंटरफेस और इंटरफेस बिल्डर आधारित थे। जबकि नेक्स्ट वर्कस्टेशन बाज़ार में एक बड़ा प्रभाव बनाने में विफल रहे, उद्योग में उपकरणों की व्यापक रूप से सराहना की गई। इसने नेक्स्ट को हार्डवेयर उत्पादन को छोड़ने और सॉफ्टवेयर टूल्स पर ध्यान केंद्रित करने, कस्टम प्रोग्रामिंग के लिए एक मंच के रूप में नेक्स्टस्टेप (और ओपनस्टेप) को बेचने का नेतृत्व किया।


[[GPL]] की शर्तों को दरकिनार करने के लिए, NeXT मूल रूप से ऑब्जेक्टिव-सी फ्रंटएंड को अलग से शिप करने का इरादा रखता था, जिससे उपयोगकर्ता इसे GCC के साथ लिंक करके कंपाइलर निष्पादन योग्य बना सके। हालांकि शुरू में रिचर्ड एम. स्टॉलमैन द्वारा स्वीकार किया गया था, स्टॉलमैन द्वारा जीएनयू के वकीलों के साथ परामर्श करने के बाद इस योजना को अस्वीकार कर दिया गया था और नेक्स्ट ने ऑब्जेक्टिव-सी को जीसीसी का हिस्सा बनाने पर सहमति व्यक्त की थी।<ref>{{cite web|url=https://github.com/JoshCheek/clisp/blob/master/doc/Why-CLISP-is-under-GPL|title=Common Lisp and Readline|website=[[GitHub]] |quote=The issue first arose when NeXT proposed to distribute a modified GCC in two parts and let the user link them. Jobs asked me whether this was lawful. It seemed to me at the time that it was, following reasoning like what you are using; but since the result was very undesirable for free software, I said I would have to ask the lawyer. What the lawyer said surprised me; he said that judges would consider such schemes to be "subterfuges" and would be very harsh toward them.  He said a judge would ask whether it is "really" one program, rather than how it is labeled.  So I went back to Jobs and said we believed his plan was not allowed by the GPL.  The direct result of this is that we now have an Objective C front end.  They had wanted to distribute the Objective C parser as a separate proprietary package to link with the GCC back end, but since I didn't agree this was allowed, they made it free.|access-date=September 15, 2014|archive-url=https://web.archive.org/web/20140906185259/http://clisp.cvs.sourceforge.net/viewvc/clisp/clisp/doc/Why-CLISP-is-under-GPL|archive-date=September 6, 2014|url-status=live}}</ref>
जीएनयू परियोजना ने [[ओपनस्टेप]] मानक के आधार पर [[जीएनयूस्टेप]] नामक कोको (एपीआई) के अपने मुफ्त सॉफ्टवेयर कार्यान्वयन पर काम प्रारंभ किया।<ref name="GNUstep site">{{cite web |url=http://www.gnustep.org/information/aboutGNUstep.html |publisher=GNUstep developers/GNU Project |title=GNUstep: Introduction |access-date=July 29, 2012 |archive-url=https://web.archive.org/web/20120806172414/http://www.gnustep.org/information/aboutGNUstep.html |archive-date=August 6, 2012 |url-status=live }}</ref> डेनिस ग्लैटिंग ने 1992 में पहला जीएनयू ऑब्जेक्टिव-सी [[रन टाइम सिस्टम|रन टाइम प्रणाली]] लिखा था। जीएनयू ऑब्जेक्टिव-सी रनटाइम, जो 1993 से उपयोग में है, क्रेस्टन क्रैब थोरुप द्वारा विकसित किया गया है जब वह [[डेनमार्क]] में विश्वविद्यालय के छात्र थे। थोरुप ने 1993 से 1996 तक नेक्स्ट में भी काम किया।<ref>{{Cite web|url=https://www.linkedin.com/in/krestenkrabthorup|title=Kresten Krab Thorup {{!}} LinkedIn|website=www.linkedin.com|access-date=June 23, 2016|archive-url=https://web.archive.org/web/20140715173258/http://www.linkedin.com/in/krestenkrabthorup|archive-date=July 15, 2014|url-status=live}}</ref>
जीएनयू कंपाइलर संग्रह का विस्तार करने का काम स्टीव नारॉफ के नेतृत्व में किया गया था, जो स्टेपस्टोन से नेक्स्ट में शामिल हुए थे। [[जीएनयू पब्लिक लाइसेंस]] लाइसेंस शर्तों के अनुसार संकलक परिवर्तन उपलब्ध कराए गए थे, लेकिन रनटाइम पुस्तकालय नहीं थे, जो खुले स्रोत के योगदान को आम जनता के लिए अनुपयोगी बना रहे थे। इसने अन्य पार्टियों को ओपन सोर्स लाइसेंस के तहत ऐसी रनटाइम लाइब्रेरी विकसित करने के लिए प्रेरित किया। बाद में, क्लैंग के लिए ऑब्जेक्टिव-सी फ्रंटएंड बनाने के लिए एप्पल में काम करने के लिए स्टीव नारॉफ का भी प्रमुख योगदान था।


जीएनयू परियोजना ने [[ओपनस्टेप]] मानक के आधार पर [[जीएनयूस्टेप]] नामक कोको (एपीआई) के अपने मुफ्त सॉफ्टवेयर कार्यान्वयन पर काम शुरू किया।<ref name="GNUstep site">{{cite web |url=http://www.gnustep.org/information/aboutGNUstep.html |publisher=GNUstep developers/GNU Project |title=GNUstep: Introduction |access-date=July 29, 2012 |archive-url=https://web.archive.org/web/20120806172414/http://www.gnustep.org/information/aboutGNUstep.html |archive-date=August 6, 2012 |url-status=live }}</ref> डेनिस ग्लैटिंग ने 1992 में पहला जीएनयू ऑब्जेक्टिव-सी [[रन टाइम सिस्टम]] लिखा था। जीएनयू ऑब्जेक्टिव-सी रनटाइम, जो 1993 से उपयोग में है, क्रेस्टन क्रैब थोरुप द्वारा विकसित किया गया है जब वह [[डेनमार्क]] में एक विश्वविद्यालय के छात्र थे।{{citation needed|date=April 2013}} थोरुप ने 1993 से 1996 तक नेक्स्ट में भी काम किया।<ref>{{Cite web|url=https://www.linkedin.com/in/krestenkrabthorup|title=Kresten Krab Thorup {{!}} LinkedIn|website=www.linkedin.com|access-date=June 23, 2016|archive-url=https://web.archive.org/web/20140715173258/http://www.linkedin.com/in/krestenkrabthorup|archive-date=July 15, 2014|url-status=live}}</ref>




=== सेब विकास और स्विफ्ट ===
=== एप्पल विकास और स्विफ्ट ===
1996 में NeXT को प्राप्त करने के बाद, Apple कंप्यूटर ने अपने तत्कालीन नए ऑपरेटिंग सिस्टम, [[Mac OS X]] में OpenStep का उपयोग किया। इसमें Objective-C, NeXT का Objective-C- आधारित डेवलपर टूल, [[प्रोजेक्ट बिल्डर]] और इसका इंटरफ़ेस डिज़ाइन टूल, [[इंटरफ़ेस बिल्डर]] शामिल थे। दोनों को बाद में एक एप्लिकेशन, [[Xcode]] में मिला दिया गया। Apple का अधिकांश वर्तमान कोको (API) OpenStep इंटरफ़ेस ऑब्जेक्ट्स पर आधारित है और सक्रिय विकास के लिए उपयोग किया जा रहा सबसे महत्वपूर्ण ऑब्जेक्टिव-सी वातावरण है।
1996 में नेक्स्ट को प्राप्त करने के बाद, एप्पल कंप्यूटर ने अपने तत्कालीन नए ऑपरेटिंग प्रणाली, [[Mac OS X|मैक ओयस एक्स]] में ओपनस्टेप का उपयोग किया। इसमें उद्देश्य सी, नेक्स्ट का उद्देश्य सी- आधारित डेवलपर उपकरण, [[प्रोजेक्ट बिल्डर]] और इसका इंटरफ़ेस डिज़ाइन उपकरण, [[इंटरफ़ेस बिल्डर]] सम्मिलित थे। दोनों को बाद में एक एप्लिकेशन, [[Xcode|एक्सकोड]] में मिला दिया गया। एप्पल का अधिकांश वर्तमान कोको (एपीआई) ओपनस्टेप इंटरफ़ेस ऑब्जेक्ट्स पर आधारित है और सक्रिय विकास के लिए उपयोग किया जा रहा सबसे महत्वपूर्ण ऑब्जेक्टिव-सी वातावरण है।


[[WWDC]] 2014 में, Apple ने एक नई भाषा, स्विफ्ट (प्रोग्रामिंग लैंग्वेज) पेश की, जिसे C के बिना ऑब्जेक्टिव-सी के रूप में चित्रित किया गया था।
[[WWDC|डब्ल्यूडब्ल्यूडीसी]] 2014 में, एप्पल ने नई भाषा, स्विफ्ट (प्रोग्रामिंग भाषा) प्रस्तुत की, जिसे सी के बिना ऑब्जेक्टिव-सी के रूप में चित्रित किया गया था।


== सिंटेक्स ==
== सिंटेक्स ==
ऑब्जेक्टिव-सी सी (प्रोग्रामिंग लैंग्वेज) के ऊपर एक पतली परत है और सी का एक सख्त [[सुपरसेट]] है, जिसका अर्थ है कि किसी भी सी प्रोग्राम को ऑब्जेक्टिव-सी कंपाइलर के साथ संकलित करना और ऑब्जेक्टिव-सी क्लास के भीतर सी भाषा कोड को स्वतंत्र रूप से शामिल करना संभव है। .<ref>{{cite web
ऑब्जेक्टिव-सी सी (प्रोग्रामिंग भाषा) के ऊपर पतली परत है और सी का सख्त [[सुपरसेट]] है, जिसका अर्थ है कि किसी भी सी प्रोग्राम को ऑब्जेक्टिव-सी कंपाइलर के साथ संकलित करना और ऑब्जेक्टिव-सी क्लास के अन्दर सी भाषा कोड को स्वतंत्र रूप से सम्मिलित करना संभव है।<ref>{{cite web
  |url= https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html
  |url= https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html
  |title= Write Objective-C Code
  |title= Write Objective-C Code
Line 104: Line 110:
  |url-status= live
  |url-status= live
  }}</ref><ref>{{cite web |url=https://www.informit.com/articles/article.aspx?p=1765122 |title=Objective-C Boot Camp |quote=Objective-C is a strict superset of ANSI C |access-date=February 11, 2018 |archive-url=https://web.archive.org/web/20180211131704/https://www.informit.com/articles/article.aspx?p=1765122 |archive-date=February 11, 2018 |url-status=live }}</ref><ref>{{cite web |url=http://www.drdobbs.com/examining-objective-c/184402055 |title=Examining Objective-C |quote=Objective-C is an object-oriented strict superset of C |access-date=September 4, 2014 |archive-url=https://web.archive.org/web/20140904203055/http://www.drdobbs.com/examining-objective-c/184402055 |archive-date=September 4, 2014 |url-status=live }}</ref><ref>{{cite book|url=https://books.google.com/books?id=ec6zAAAAQBAJ&pg=PA381|title=Pro Objective-C|first=Keith|last=Lee|date=September 3, 2013|publisher=Apress|isbn=9781430250500|access-date=December 24, 2017|via=Google Books|archive-url=https://web.archive.org/web/20180514192627/https://books.google.com/books?id=ec6zAAAAQBAJ&lpg=PA381&ots=NoFaE3OEX0&pg=PA381#v=onepage&q&f=false|archive-date=May 14, 2018|url-status=live}}</ref><ref>{{cite web|url=https://web.mit.edu/darwin/src/modules/headerdoc/Documentation/ObjCTags.html|title=Tags for Objective-C Headers|quote=Objective-C is a superset of C|access-date=February 11, 2018|archive-url=https://web.archive.org/web/20170401034714/http://web.mit.edu/darwin/src/modules/headerdoc/Documentation/ObjCTags.html|archive-date=April 1, 2017|url-status=live}}</ref><ref>{{cite web |url=https://www-01.ibm.com/support/docview.wss?uid=swg24034606 |title=AppScan Source 8.7 now available |quote=The Objective-C programming language is a superset of the C programming language |access-date=February 11, 2018 |archive-url=https://web.archive.org/web/20170203131125/http://www-01.ibm.com/support/docview.wss?uid=swg24034606 |archive-date=February 3, 2017 |url-status=live }}</ref>
  }}</ref><ref>{{cite web |url=https://www.informit.com/articles/article.aspx?p=1765122 |title=Objective-C Boot Camp |quote=Objective-C is a strict superset of ANSI C |access-date=February 11, 2018 |archive-url=https://web.archive.org/web/20180211131704/https://www.informit.com/articles/article.aspx?p=1765122 |archive-date=February 11, 2018 |url-status=live }}</ref><ref>{{cite web |url=http://www.drdobbs.com/examining-objective-c/184402055 |title=Examining Objective-C |quote=Objective-C is an object-oriented strict superset of C |access-date=September 4, 2014 |archive-url=https://web.archive.org/web/20140904203055/http://www.drdobbs.com/examining-objective-c/184402055 |archive-date=September 4, 2014 |url-status=live }}</ref><ref>{{cite book|url=https://books.google.com/books?id=ec6zAAAAQBAJ&pg=PA381|title=Pro Objective-C|first=Keith|last=Lee|date=September 3, 2013|publisher=Apress|isbn=9781430250500|access-date=December 24, 2017|via=Google Books|archive-url=https://web.archive.org/web/20180514192627/https://books.google.com/books?id=ec6zAAAAQBAJ&lpg=PA381&ots=NoFaE3OEX0&pg=PA381#v=onepage&q&f=false|archive-date=May 14, 2018|url-status=live}}</ref><ref>{{cite web|url=https://web.mit.edu/darwin/src/modules/headerdoc/Documentation/ObjCTags.html|title=Tags for Objective-C Headers|quote=Objective-C is a superset of C|access-date=February 11, 2018|archive-url=https://web.archive.org/web/20170401034714/http://web.mit.edu/darwin/src/modules/headerdoc/Documentation/ObjCTags.html|archive-date=April 1, 2017|url-status=live}}</ref><ref>{{cite web |url=https://www-01.ibm.com/support/docview.wss?uid=swg24034606 |title=AppScan Source 8.7 now available |quote=The Objective-C programming language is a superset of the C programming language |access-date=February 11, 2018 |archive-url=https://web.archive.org/web/20170203131125/http://www-01.ibm.com/support/docview.wss?uid=swg24034606 |archive-date=February 3, 2017 |url-status=live }}</ref>
ऑब्जेक्टिव-सी स्मॉलटाक से अपना ऑब्जेक्ट सिंटैक्स प्राप्त करता है। गैर-ऑब्जेक्ट-ओरिएंटेड ऑपरेशंस के लिए सभी सिंटैक्स (आदिम चर, प्री-प्रोसेसिंग, एक्सप्रेशन, फ़ंक्शन डिक्लेरेशन और फ़ंक्शन कॉल सहित) सी के समान हैं, जबकि ऑब्जेक्ट-ओरिएंटेड सुविधाओं के लिए सिंटैक्स स्मालटाक का कार्यान्वयन है- शैली संदेश।
 
ऑब्जेक्टिव-सी स्मॉलटाक से अपना ऑब्जेक्ट सिंटैक्स प्राप्त करता है। गैर-ऑब्जेक्ट-ओरिएंटेड ऑपरेशंस के लिए सभी सिंटैक्स (आदिम चर, प्री-प्रोसेसिंग, एक्सप्रेशन, फलन डिक्लेरेशन और फलन कॉल सहित) सी के समान हैं, जबकि ऑब्जेक्ट-ओरिएंटेड सुविधाओं के लिए सिंटैक्स स्मालटाक का कार्यान्वयन है।


=== संदेश ===
=== संदेश ===
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का ऑब्जेक्टिव-सी मॉडल ऑब्जेक्ट इंस्टेंस को भेजे जाने वाले संदेश पर आधारित है। ऑब्जेक्टिव-सी में कोई विधि नहीं कहता है; एक संदेश भेजता है। यह [[सी ++]] द्वारा उपयोग किए जाने वाले [[शुरुआत]]-शैली प्रोग्रामिंग मॉडल के विपरीत है। इन दो अवधारणाओं के बीच का अंतर यह है कि विधि या संदेश नाम से संदर्भित कोड को कैसे निष्पादित किया जाता है। सिमुला-शैली की भाषा में, विधि का नाम ज्यादातर मामलों में संकलक द्वारा लक्ष्य वर्ग में कोड के एक खंड के लिए बाध्यकारी होता है। स्मॉलटॉक और ऑब्जेक्टिव-सी में, संदेश का लक्ष्य रनटाइम पर हल किया जाता है, जिसमें प्राप्त वस्तु स्वयं संदेश की व्याख्या करती है। चयनकर्ता या [https://developer.apple.com/documentation/objectivec/sel?language=occ द्वारा विधि की पहचान की जाती है {{mono|SEL}}] — प्रत्येक संदेश नाम के लिए एक अद्वितीय पहचानकर्ता, अक्सर केवल एक <!-- NUL (a character, often ASCII code 0x00) not NULL (a pointer) -->अशक्त-समाप्त स्ट्रिंग |{{mono|NUL}}-टर्मिनेटेड स्ट्रिंग इसके नाम का प्रतिनिधित्व करती है - और इसे लागू करने वाले C मेथड [[सूचक (कंप्यूटर प्रोग्रामिंग)]] के लिए हल किया गया<!-- please refer to https://leo.stcloudstate.edu/punct/col-semi.html for colon vs semicolon usage -->: एक [https://developer.apple.com/documentation/objectivec/objective-c_runtime/imp?language=occ {{mono|IMP}}].<ref>{{cite web
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का ऑब्जेक्टिव-सी मॉडल ऑब्जेक्ट इंस्टेंस को भेजे जाने वाले संदेश पर आधारित है। ऑब्जेक्टिव-सी में कोई विधि नहीं कहता है; संदेश भेजता है। यह [[सी ++]] द्वारा उपयोग किए जाने वाले [[शुरुआत|प्रारंभ]]- शैली प्रोग्रामिंग मॉडल के विपरीत है। इन दो अवधारणाओं के बीच का अंतर यह है कि विधि या संदेश नाम से संदर्भित कोड को कैसे निष्पादित किया जाता है। सिमुला-शैली की भाषा में, विधि का नाम अधिकांशतः स्थितियों में संकलक द्वारा लक्ष्य वर्ग में कोड के खंड के लिए बाध्यकारी होता है। स्मॉलटॉक और ऑब्जेक्टिव-सी में, संदेश का लक्ष्य रनटाइम पर हल किया जाता है, जिसमें प्राप्त वस्तु स्वयं संदेश की व्याख्या करती है। चयनकर्ता या [https://developer.apple.com/documentation/objectivec/sel?language=occ द्वारा विधि की पहचान की जाती है {{mono|SEL}}] — प्रत्येक संदेश नाम के लिए अद्वितीय पहचानकर्ता, अधिकांशतः केवल अशक्त-समाप्त स्ट्रिंग {{mono|एनयूएल}}-टर्मिनेटेड स्ट्रिंग इसके नाम का प्रतिनिधित्व करती है - और इसे प्रयुक्त करने वाले सी मेथड [[सूचक (कंप्यूटर प्रोग्रामिंग)]] के लिए हल किया गया: [https://developer.apple.com/documentation/objectivec/objective-c_runtime/imp?language=occ {{mono|IMP}}].<ref>{{cite web
  |author= Apple, Inc.
  |author= Apple, Inc.
  |author-link= Apple, Inc.
  |author-link= Apple, Inc.
Line 118: Line 125:
  |archive-date= September 7, 2010
  |archive-date= September 7, 2010
  |url-status= live
  |url-status= live
  }}</ref> इसका एक परिणाम यह है कि संदेश-पासिंग प्रणाली में कोई प्रकार की जाँच नहीं होती है। जिस वस्तु को संदेश निर्देशित किया गया है - प्राप्तकर्ता - को संदेश का जवाब देने की गारंटी नहीं है, और यदि ऐसा नहीं होता है, तो यह अपवाद उठाता है।<ref>{{cite web
  }}</ref> इसका परिणाम यह है कि संदेश-पासिंग प्रणाली में कोई प्रकार की जाँच नहीं होती है। जिस वस्तु को संदेश निर्देशित किया गया है - प्राप्तकर्ता - को संदेश का उत्तर देने की जिम्मेदारी नहीं है, और यदि ऐसा नहीं होता है, तो यह अपवाद उठाता है।<ref>{{cite web
  |author= Apple, Inc.
  |author= Apple, Inc.
  |author-link= Apple, Inc.
  |author-link= Apple, Inc.
Line 127: Line 134:
  |archive-url= https://web.archive.org/web/20100908132046/http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocSelectors.html
  |archive-url= https://web.archive.org/web/20100908132046/http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocSelectors.html
  |archive-date= September 8, 2010}}</ref>
  |archive-date= September 8, 2010}}</ref>
संदेश भेज रहा हूँ {{mono|method}} सूचक द्वारा इंगित वस्तु के लिए {{mono|obj}} सी ++ में निम्नलिखित कोड की आवश्यकता होगी:


<syntaxhighlight lang= cpp>obj->विधि(तर्क);</syntaxhighlight>
संदेश भेज रहा हूँ {{mono|विधि}} सूचक द्वारा इंगित वस्तु के लिए {{mono|ओबीजे}} सी ++ में निम्नलिखित कोड की आवश्यकता होगी:
 
<syntaxhighlight lang="cpp">obj->method(argument);</syntaxhighlight>


ऑब्जेक्टिव-सी में, इसे इस प्रकार लिखा गया है:
ऑब्जेक्टिव-सी में, इसे इस प्रकार लिखा गया है:
Line 135: Line 143:
<syntaxhighlight lang= objc >[obj method:argument];</syntaxhighlight>
<syntaxhighlight lang= objc >[obj method:argument];</syntaxhighlight>


मेथड कॉल का कंपाइलर द्वारा अनुवाद किया जाता है {{mono|objc_msgSend(id self, SEL op, ...)}} रनटाइम कार्यों का परिवार। विभिन्न कार्यान्वयन आधुनिक परिवर्धन को संभालते हैं जैसे {{mono|super}}.<ref>{{cite web |title=objc_msgSend - Objective-C Runtime |url=https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend |website=Apple Developer Documentation |access-date=10 February 2020}}</ref> जीएनयू परिवारों में इस समारोह का नाम है {{mono|objc_msg_sendv}}, लेकिन इसके तहत एक आधुनिक लुकअप सिस्टम के पक्ष में इसे बहिष्कृत कर दिया गया है {{mono|objc_msg_lookup}}.<ref>{{cite web |title=Messaging with the GNU Objective-C runtime |url=https://gcc.gnu.org/onlinedocs/gcc/Messaging-with-the-GNU-Objective-C-runtime.html |website=Using the GNU Compiler Collection (GCC) |access-date=10 February 2020}}</ref>
मेथड कॉल का कंपाइलर द्वारा अनुवाद किया जाता है {{mono|objc_msgSend(id self, SEL op, ...)}} रनटाइम कार्यों का परिवार। विभिन्न कार्यान्वयन आधुनिक परिवर्धन को संभालते हैं जैसे {{mono|super}}.<ref>{{cite web |title=objc_msgSend - Objective-C Runtime |url=https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend |website=Apple Developer Documentation |access-date=10 February 2020}}</ref> जीएनयू परिवारों में इस प्रणाली का नाम है {{mono|objc_msg_sendv}}, लेकिन इसके अनुसार आधुनिक लुकअप प्रणाली के पक्ष में इसे बहिष्कृत कर दिया गया है {{mono|objc_msg_lookup}}.<ref>{{cite web |title=Messaging with the GNU Objective-C runtime |url=https://gcc.gnu.org/onlinedocs/gcc/Messaging-with-the-GNU-Objective-C-runtime.html |website=Using the GNU Compiler Collection (GCC) |access-date=10 February 2020}}</ref>
प्रोग्रामिंग की दोनों शैलियों की अपनी ताकत और कमजोरियां हैं। सिमुला (सी ++) शैली में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग जब भी संभव हो तो [[संकलन-समय बाध्यकारी]] का उपयोग करके एकाधिक विरासत और तेज़ निष्पादन की अनुमति देता है, लेकिन यह डिफ़ॉल्ट रूप से [[गतिशील प्रेषण]] का समर्थन नहीं करता है। जब तक वे सार पद्धति नहीं हैं, तब तक यह सभी विधियों को एक समान कार्यान्वयन के लिए बाध्य करता है। ऑब्जेक्टिव-सी में उपयोग की जाने वाली स्मॉलटाक-शैली की प्रोग्रामिंग संदेशों को बिना क्रियान्वित किए जाने की अनुमति देती है, रनटाइम पर इसके कार्यान्वयन के लिए हल की गई विधि के साथ। उदाहरण के लिए, वस्तुओं के संग्रह के लिए एक संदेश भेजा जा सकता है, जिसके लिए रनटाइम त्रुटियों के उत्पादन के डर के बिना केवल कुछ लोगों को प्रतिक्रिया देने की उम्मीद की जाएगी। संदेश पास करने के लिए यह भी आवश्यक नहीं है कि किसी वस्तु को संकलन समय पर परिभाषित किया जाए। व्युत्पन्न वस्तु में विधि को बुलाए जाने के लिए अभी भी एक कार्यान्वयन की आवश्यकता है। (गतिशील (देर से) बाइंडिंग के अधिक लाभों के लिए नीचे #Dynamic टाइपिंग अनुभाग देखें।)
 
प्रोग्रामिंग की दोनों शैलियों की अपनी ताकत और कमजोरियां हैं। सिमुला (सी ++) शैली में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग जब भी संभव हो तो [[संकलन-समय बाध्यकारी]] का उपयोग करके एकाधिक विरासत और तेज़ निष्पादन की अनुमति देता है, लेकिन यह डिफ़ॉल्ट रूप से [[गतिशील प्रेषण]] का समर्थन नहीं करता है। जब तक वे सार पद्धति नहीं हैं, तब तक यह सभी विधियों को समान कार्यान्वयन के लिए बाध्य करता है। ऑब्जेक्टिव-सी में उपयोग की जाने वाली स्मॉलटाक-शैली की प्रोग्रामिंग संदेशों को बिना क्रियान्वित किए जाने की अनुमति देती है, रनटाइम पर इसके कार्यान्वयन के लिए हल की गई विधि के साथ। उदाहरण के लिए, वस्तुओं के संग्रह के लिए संदेश भेजा जा सकता है, जिसके लिए रनटाइम त्रुटियों के उत्पादन के डर के बिना केवल कुछ लोगों को प्रतिक्रिया देने की उम्मीद की जाएगी। संदेश पास करने के लिए यह भी आवश्यक नहीं है कि किसी वस्तु को संकलन समय पर परिभाषित किया जाए। व्युत्पन्न वस्तु में विधि को बुलाए जाने के लिए अभी भी कार्यान्वयन की आवश्यकता है। (गतिशील (देर से) बाइंडिंग के अधिक लाभों के लिए नीचे गतिशील टाइपिंग अनुभाग देखें।)


=== इंटरफेस और कार्यान्वयन ===
=== इंटरफेस और कार्यान्वयन ===
उद्देश्य-सी के लिए आवश्यक है कि एक वर्ग का इंटरफ़ेस और कार्यान्वयन अलग-अलग घोषित कोड ब्लॉक में हो। परिपाटी के अनुसार, डेवलपर्स इंटरफ़ेस को हेडर फ़ाइल में और कार्यान्वयन को कोड फ़ाइल में रखते हैं। [[हेडर फाइल]]ें, सामान्य रूप से .h, C हेडर फाइलों के समान होती हैं, जबकि कार्यान्वयन (विधि) फाइलें, सामान्य रूप से प्रत्ययित होती हैं। m, C कोड फाइलों के समान हो सकती हैं।
उद्देश्य-सी के लिए आवश्यक है कि एक वर्ग का इंटरफ़ेस और कार्यान्वयन अलग-अलग घोषित कोड ब्लॉक में हो। परिपाटी के अनुसार, डेवलपर्स इंटरफ़ेस को हेडर फ़ाइल में और कार्यान्वयन को कोड फ़ाइल में रखते हैं। [[हेडर फाइल]], सामान्य रूप से .एच, सी हेडर फाइलों के समान होती हैं, जबकि कार्यान्वयन (विधि) फाइलें, सामान्य रूप से प्रत्ययित होती हैं। एम, सी कोड फाइलों के समान हो सकती हैं।


==== इंटरफ़ेस ====
==== इंटरफ़ेस ====
यह अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं, जैसे C++ या Python में उपयोग की जाने वाली क्लास डिक्लेरेशन के अनुरूप है।
यह अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं, जैसे सी++ या पायथन में उपयोग की जाने वाली क्लास डिक्लेरेशन के अनुरूप है।


किसी वर्ग का इंटरफ़ेस आमतौर पर हेडर फ़ाइल में परिभाषित किया जाता है। वर्ग के नाम के बाद हेडर फ़ाइल का नाम देना एक आम परंपरा है, उदा। {{mono|Ball.h}} वर्ग के लिए इंटरफ़ेस शामिल होगा {{mono|Ball}}.
किसी वर्ग का इंटरफ़ेस सामान्यतः हेडर फ़ाइल में परिभाषित किया जाता है। वर्ग के नाम के बाद हेडर फ़ाइल का नाम देना सामान्य परंपरा है, उदा। {{mono|Ball.h}} वर्ग के लिए इंटरफ़ेस सम्मिलित होगा {{mono|Ball}}.


एक इंटरफ़ेस घोषणा प्रपत्र लेती है:
इंटरफ़ेस घोषणा प्रपत्र लेती है:<syntaxhighlight>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
@interface classname : superclassname {
@इंटरफेस क्लासनाम: सुपरक्लासनाम {
   // instance variables
   // आवृत्ति के चर
}
}
+ क्लासमेथोड 1;
+ classMethod1;
+ (रिटर्न_टाइप) क्लासमेथोड 2;
+ (return_type)classMethod2;
+ (वापसी_ प्रकार) [[वर्ग विधि]] 3: (परम 1_ प्रकार) परम 1_वरनाम;
+ (return_type)classMethod3:(param1_type)param1_varName;
 
- (वापसी_प्रकार) [[उदाहरण विधि]] 1 एक पैरामीटर के साथ: (param1_type) param1_varName;
- (वापसी_प्रकार) उदाहरण विधि 2 विथ 2 पैरामीटर: (परम 1_ प्रकार) परम 1_varName
                              param2_callName: (param2_type) param2_varName;
@अंत
</वाक्यविन्यास हाइलाइट>


उपरोक्त में, प्लस चिह्न वर्ग विधियों, या विधियों को निरूपित करते हैं जिन्हें कक्षा में ही बुलाया जा सकता है (उदाहरण पर नहीं), और ऋण चिह्न उदाहरण विधियों को दर्शाते हैं, जिन्हें केवल कक्षा के किसी विशेष उदाहरण पर ही बुलाया जा सकता है। क्लास के तरीकों की भी [[उदाहरण चर]]्स तक पहुंच नहीं है।
- (return_type)instanceMethod1With1Parameter:(param1_type)param1_varName;
- (return_type)instanceMethod2With2Parameters:(param1_type)param1_varName
                              param2_callName:(param2_type)param2_varName;
@end
</syntaxhighlight>उपरोक्त में, प्लस चिह्न वर्ग विधियों, या विधियों को निरूपित करते हैं जिन्हें कक्षा में ही बुलाया जा सकता है (उदाहरण पर नहीं), और ऋण चिह्न उदाहरण विधियों को दर्शाते हैं, जिन्हें केवल कक्षा के किसी विशेष उदाहरण पर ही बुलाया जा सकता है। क्लास के विधियों की भी [[उदाहरण चर]] तक पहुंच नहीं है।


ऊपर दिया गया कोड मोटे तौर पर निम्नलिखित C++ इंटरफ़ेस के बराबर है:


<वाक्यविन्यास लैंग = सीपीपी>
ऊपर दिया गया कोड सामान्यता निम्नलिखित सी++ इंटरफ़ेस के बराबर है:<syntaxhighlight>
क्लास क्लासनाम: पब्लिक सुपरक्लासनाम {
class classname : public superclassname {
संरक्षित:
protected:
   // आवृत्ति के चर
   // instance variables


जनता:
public:
   // कक्षा (स्थैतिक) कार्य
   // Class (static) functions
   स्थैतिक शून्य * वर्ग विधि 1 ();
   static void *classMethod1();
   स्थिर रिटर्न_टाइप क्लासमेथोड 2 ();
   static return_type classMethod2();
   स्थिर रिटर्न_टाइप क्लासमेथोड 3 (परम 1_टाइप पैराम 1_varName);
   static return_type classMethod3(param1_type param1_varName);


   // उदाहरण (सदस्य) कार्य करता है
   // Instance (member) functions
   रिटर्न_टाइप इंस्टेंसमेथोड 1 विथ 1 पैरामीटर (पैरा 1_टाइप पैराम 1_varName);
   return_type instanceMethod1With1Parameter(param1_type param1_varName);
   वापसी प्रकार
   return_type
   उदाहरण मेथोड2 विथ 2 पैरामीटर (पैरा 1_टाइप पैराम 1_वरनाम,
   instanceMethod2With2Parameters(param1_type param1_varName,
                                 param2_type param2_varName = डिफ़ॉल्ट);
                                 param2_type param2_varName = default);
};
};
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>ध्यान दें कि {{mono|instanceMethod2With2Parameters:param2_callName:}} तर्क अभिव्यक्तियों के साथ चयनकर्ता खंडों के अंतःक्रिया को प्रदर्शित करता है, जिसके लिए सी सी ++ में कोई प्रत्यक्ष समकक्ष नहीं है।
 
ध्यान दें कि {{mono|instanceMethod2With2Parameters:param2_callName:}} तर्क अभिव्यक्तियों के साथ चयनकर्ता खंडों के अंतःक्रिया को प्रदर्शित करता है, जिसके लिए सी/सी ++ में कोई प्रत्यक्ष समकक्ष नहीं है।


वापसी प्रकार कोई भी मानक सी (प्रोग्रामिंग भाषा) प्रकार हो सकता है, एक सामान्य ऑब्जेक्टिव-सी ऑब्जेक्ट के लिए एक सूचक, एक विशिष्ट प्रकार की वस्तु के लिए सूचक जैसे NSArray *, NSImage *, या NSString *, या कक्षा के लिए सूचक जो विधि संबंधित है (उदाहरण प्रकार)। डिफ़ॉल्ट रिटर्न प्रकार सामान्य उद्देश्य-सी प्रकार है {{mono|id}}.
वापसी प्रकार कोई भी मानक सी (प्रोग्रामिंग भाषा) प्रकार हो सकता है, सामान्य ऑब्जेक्टिव-सी ऑब्जेक्ट के लिए सूचक, विशिष्ट प्रकार की वस्तु के लिए सूचक जैसे एनएसएआरएआरई एनएसआईमेज, या एनएसएसटींग *, या कक्षा के लिए सूचक जो विधि संबंधित है (उदाहरण प्रकार)। डिफ़ॉल्ट रिटर्न प्रकार सामान्य उद्देश्य-सी प्रकार है {{mono|id}}.


विधि तर्क एक नाम के साथ शुरू होता है जो उस तर्क को लेबल करता है जो विधि नाम का हिस्सा है, उसके बाद कोलन के बाद कोष्ठक में अपेक्षित तर्क प्रकार और तर्क नाम होता है। लेबल छोड़ा जा सकता है।
विधि तर्क नाम के साथ प्रारंभ होता है जो उस तर्क को लेबल करता है जो विधि नाम का भाग है, उसके बाद कोलन के बाद कोष्ठक में अपेक्षित तर्क प्रकार और तर्क नाम होता है। लेबल छोड़ा जा सकता है।<syntaxhighlight>
 
- (void)setRangeStart:(int)start end:(int)end;
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (void)importDocumentWithName:(NSString *)name
- (शून्य) सेटरेंज स्टार्ट: (इंट) स्टार्ट एंड: (इंट) एंड;
- (शून्य) आयात दस्तावेज़ विथनाम: (एनएसएसटींग *) नाम
       withSpecifiedPreferences:(Preferences *)prefs
       withSpecifiedPreferences:(Preferences *)prefs
                     पृष्ठ से पहले: (int) सम्मिलित करें पृष्ठ;
                     beforePage:(int)insertPage;
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>इंटरफ़ेस परिभाषा का व्युत्पन्न श्रेणी है, जो किसी को वर्त्तमान कक्षाओं में विधियों को जोड़ने की अनुमति देता है।<ref>{{cite web |title=Category |url=https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Category.html |website=Apple Developer (Cocoa Core Competencies)}}</ref>
 
इंटरफ़ेस परिभाषा का व्युत्पन्न श्रेणी है, जो किसी को मौजूदा कक्षाओं में विधियों को जोड़ने की अनुमति देता है।<ref>{{cite web |title=Category |url=https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Category.html |website=Apple Developer (Cocoa Core Competencies)}}</ref>




==== कार्यान्वयन ====
==== कार्यान्वयन ====
इंटरफ़ेस केवल क्लास इंटरफ़ेस की घोषणा करता है न कि स्वयं विधियों की: वास्तविक कोड कार्यान्वयन फ़ाइल में लिखा गया है। कार्यान्वयन (विधि) फ़ाइलों में सामान्य रूप से फ़ाइल एक्सटेंशन होता है <code>.m</code>, जो मूल रूप से संदेशों को दर्शाता था।<ref>{{cite book |last1=Dalrymple |first1=Mark |last2=Knaster |first2=Scott |title=Learn Objective-C on the Mac |date=June 27, 2012 |page=9 |quote=The .m extension originally stood for "messages" when Objective-C was first introduced, referring to a central feature of Objective-C |isbn=9781430241881}}</ref>
इंटरफ़ेस केवल क्लास इंटरफ़ेस की घोषणा करता है न कि स्वयं विधियों की: वास्तविक कोड कार्यान्वयन फ़ाइल में लिखा गया है। कार्यान्वयन (विधि) फ़ाइलों में सामान्य रूप से फ़ाइल एक्सटेंशन होता है <code>.ऍम</code>, जो मूल रूप से संदेशों को दर्शाता था।<ref>{{cite book |last1=Dalrymple |first1=Mark |last2=Knaster |first2=Scott |title=Learn Objective-C on the Mac |date=June 27, 2012 |page=9 |quote=The .m extension originally stood for "messages" when Objective-C was first introduced, referring to a central feature of Objective-C |isbn=9781430241881}}</ref><syntaxhighlight>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
@implementation classname
@कार्यान्वयन वर्गनाम
+ (return_type)classMethod {
+ (वापसी_ प्रकार) वर्ग विधि {
   // implementation
   // कार्यान्वयन
}
}
- (वापसी_प्रकार) उदाहरण विधि {
- (return_type)instanceMethod {
   // कार्यान्वयन
   // implementation
}
}
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


विधियों को उनके इंटरफ़ेस घोषणाओं का उपयोग करके लिखा गया है।
ऑब्जेक्टिव-सी और सी की तुलना:


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
विधियों को उनके इंटरफ़ेस घोषणाओं का उपयोग करके लिखा गया है। ऑब्जेक्टिव-सी और सी की तुलना:<syntaxhighlight>
- (इंट) विधि: (इंट) मैं {
- (int)method:(int)i {
   वापसी [स्व वर्ग_रोट: मैं];
   return [self square_root:i];
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight><syntaxhighlight>
 
int function(int i) {
<वाक्यविन्यास प्रकाश लैंग = सी>
   return square_root(i);
इंट फंक्शन (इंट आई) {
   वापसी वर्ग_रूट (i);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>सिंटैक्स छद्म-[[नामित पैरामीटर]] की अनुमति देता है।<syntaxhighlight>
 
- (void)changeColorToRed:(float)red green:(float)green blue:(float)blue {
सिंटैक्स छद्म-[[नामित पैरामीटर]] की अनुमति देता है।
   //... Implementation ...
 
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (शून्य) रंग बदलने के लिए लाल: (फ्लोट) लाल हरा: (फ्लोट) हरा नीला: (फ्लोट) नीला {
   //... कार्यान्वयन ...
}
}


// इस तरह कहा जाता है:
// Called like so:
[myColor changeColorToRed:5.0 हरा:2.0 नीला:6.0];
[myColor changeColorToRed:5.0 green:2.0 blue:6.0];
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>उद्देश्य-सी के विभिन्न कार्यान्वयनों के बीच एक विधि का आंतरिक प्रतिनिधित्व भिन्न होता है। अगर मायकोलोर क्लास का है {{mono|Color}}, उदाहरण विधि {{mono|-changeColorToRed:green:blue:}} आंतरिक रूप से लेबल किया जा सकता है {{mono|_i_Color_changeColorToRed_green_blue}}. {{mono|i}}<nowiki> }} क्लास के साथ इंस्टेंस विधि को संदर्भित करना है और फिर विधि के नाम जोड़े गए हैं और कोलन अंडरस्कोर में बदल गए हैं। जैसा कि मापदंडों का क्रम विधि नाम का भाग है, इसे कोडिंग शैली या अभिव्यक्ति के अनुरूप नहीं बदला जा सकता है, जैसा कि सही नाम वाले मापदंडों के साथ है।</nowiki>


उद्देश्य-सी के विभिन्न कार्यान्वयनों के बीच एक विधि का आंतरिक प्रतिनिधित्व भिन्न होता है। अगर myColor क्लास का है {{mono|Color}}, उदाहरण विधि {{mono|-changeColorToRed:green:blue:}} आंतरिक रूप से लेबल किया जा सकता है {{mono|_i_Color_changeColorToRed_green_blue}}. {{mono|i}} }} क्लास के साथ एक इंस्टेंस विधि को संदर्भित करना है और फिर विधि के नाम जोड़े गए हैं और कोलन अंडरस्कोर में बदल गए हैं। जैसा कि मापदंडों का क्रम विधि नाम का हिस्सा है, इसे कोडिंग शैली या अभिव्यक्ति के अनुरूप नहीं बदला जा सकता है, जैसा कि सही नाम वाले मापदंडों के साथ है।
चुकी, फलन के आंतरिक नाम शायद ही कभी सीधे उपयोग किए जाते हैं। सामान्यतः, संदेश ऑब्जेक्टिव-सी रनटाइम लाइब्रेरी में परिभाषित फलन कॉल में परिवर्तित हो जाते हैं। यह आवश्यक रूप से लिंक समय पर ज्ञात नहीं है कि किस विधि को बुलाया जाएगा क्योंकि प्राप्त करने की कक्षा (वस्तु को संदेश भेजा जा रहा है) को रनटाइम तक ज्ञात नहीं होना चाहिए।
 
हालांकि, फ़ंक्शन के आंतरिक नाम शायद ही कभी सीधे उपयोग किए जाते हैं। आम तौर पर, संदेश ऑब्जेक्टिव-सी रनटाइम लाइब्रेरी में परिभाषित फ़ंक्शन कॉल में परिवर्तित हो जाते हैं। यह आवश्यक रूप से लिंक समय पर ज्ञात नहीं है कि किस विधि को बुलाया जाएगा क्योंकि रिसीवर की कक्षा (वस्तु को संदेश भेजा जा रहा है) को रनटाइम तक ज्ञात नहीं होना चाहिए।


==== तात्कालिकता ====
==== तात्कालिकता ====
एक बार ऑब्जेक्टिव-सी क्लास लिखे जाने के बाद, इसे तत्काल किया जा सकता है। यह पहले वर्ग (एक वस्तु) के एक गैर-प्रारंभिक उदाहरण को आवंटित करके और फिर इसे आरंभ करके किया जाता है। जब तक दोनों चरण पूरे नहीं हो जाते, तब तक कोई वस्तु पूरी तरह कार्यात्मक नहीं होती है। इन चरणों को कोड की एक पंक्ति के साथ पूरा किया जाना चाहिए ताकि कभी भी आवंटित वस्तु न हो जो प्रारंभिक नहीं हुई है (और क्योंकि यह मध्यवर्ती परिणाम रखने के लिए नासमझी है <code>-init</code> जिस पर इसे कहा जाता है उससे भिन्न वस्तु वापस कर सकता है)।
एक बार ऑब्जेक्टिव-सी क्लास लिखे जाने के बाद, इसे तत्काल किया जा सकता है। यह पहले वर्ग ( वस्तु) के गैर-प्रारंभिक उदाहरण को आवंटित करके और फिर इसे आरंभ करके किया जाता है। जब तक दोनों चरण पूरे नहीं हो जाते, तब तक कोई वस्तु पूरी तरह कार्यात्मक नहीं होती है। इन चरणों को कोड की पंक्ति के साथ पूरा किया जाना चाहिए ताकि कभी भी आवंटित वस्तु न हो जो प्रारंभिक नहीं हुई है (और क्योंकि यह मध्यवर्ती परिणाम रखने के लिए नासमझी है <code>-init</code> जिस पर इसे कहा जाता है उससे भिन्न वस्तु वापस कर सकता है)।


डिफ़ॉल्ट, नो-पैरामीटर इनिशियलाइज़र के साथ इंस्टेंटेशन:
डिफ़ॉल्ट, नो-पैरामीटर इनिशियलाइज़र के साथ इंस्टेंटेशन:
Line 250: Line 238:
<syntaxhighlight lang= objc>MyObject *foo = MyObject alloc] init];</syntaxhighlight>
<syntaxhighlight lang= objc>MyObject *foo = MyObject alloc] init];</syntaxhighlight>


एक कस्टम प्रारंभकर्ता के साथ तात्कालिकता:
कस्टम प्रारंभकर्ता के साथ तात्कालिकता:


<syntaxhighlight lang= objc>MyObject *foo = MyObject alloc] initWithString:myString];</syntaxhighlight>
<syntaxhighlight lang= objc>MyObject *foo = MyObject alloc] initWithString:myString];</syntaxhighlight>


ऐसे मामले में जहां कोई कस्टम प्रारंभ नहीं किया जा रहा है, आवंटन-इनिट संदेशों के स्थान पर अक्सर नई विधि का उपयोग किया जा सकता है:
ऐसे स्थितियों में जहां कोई कस्टम प्रारंभ नहीं किया जा रहा है, आवंटन-इनिट संदेशों के स्थान पर अधिकांशतः नई विधि का उपयोग किया जा सकता है:


<syntaxhighlight lang= objc>MyObject *foo = [MyObject new];</syntaxhighlight>
<syntaxhighlight lang= objc>MyObject *foo = [MyObject new];</syntaxhighlight>


इसके अलावा, कुछ वर्ग क्लास मेथड इनिशियलाइज़र को लागू करते हैं। पसंद <code>+new</code>, वे गठबंधन करते हैं <code>+alloc</code> और <code>-init</code>, लेकिन इसके विपरीत <code>+new</code>, वे एक ऑटोरेलेज्ड उदाहरण लौटाते हैं। कुछ क्लास मेथड इनिशियलाइज़र पैरामीटर लेते हैं:
इसके अतिरिक्त, कुछ वर्ग क्लास मेथड इनिशियलाइज़र को प्रयुक्त करते हैं। पसंद <code>+new</code>, वे गठबंधन करते हैं <code>+alloc</code> और <code>-init</code>, लेकिन इसके विपरीत <code>+new</code>, वे ऑटोरेलेज्ड उदाहरण लौटाते हैं। कुछ क्लास मेथड इनिशियलाइज़र पैरामीटर लेते हैं:<syntaxhighlight>
MyObject *foo = [MyObject object];
MyObject *bar = [MyObject objectWithString:@"Wikipedia :)"];
</syntaxhighlight>


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
आबंटन संदेश किसी वस्तु के लिए सभी उदाहरण चर को रखने के लिए पर्याप्त मेमोरी आवंटित करता है, सभी उदाहरण चर को शून्य मानों पर सेट करता है, और स्मृति को वर्ग के उदाहरण में बदल देता है; प्रारंभिकरण के समय किसी भी समय स्मृति सुपरक्लास का उदाहरण नहीं है।
MyObject *foo = [MyObject ऑब्जेक्ट];
MyObject *bar = [MyObject objectWithString:@ विकिपीडिया :)];
</वाक्यविन्यास हाइलाइट>


आबंटन संदेश किसी वस्तु के लिए सभी उदाहरण चर को रखने के लिए पर्याप्त मेमोरी आवंटित करता है, सभी उदाहरण चर को शून्य मानों पर सेट करता है, और स्मृति को वर्ग के उदाहरण में बदल देता है; प्रारंभिकरण के दौरान किसी भी समय स्मृति सुपरक्लास का एक उदाहरण नहीं है।
लिनित संदेश निर्माण पर उदाहरण का सेट-अप करता है। लिनित विधि को अधिकांशतः इस प्रकार लिखा जाता है:<syntaxhighlight>
 
- (id)init {
Init संदेश निर्माण पर उदाहरण का सेट-अप करता है। Init विधि को अक्सर इस प्रकार लिखा जाता है:
     self = [super init];
 
     if (self) {
<वाक्यविन्यास लैंग = ओबीजेसी लाइन>
         // perform initialization of object here
- (आईडी) init {
     स्व = [सुपर इनिट];
     अगर (स्वयं) {
         // यहाँ वस्तु का आरंभीकरण करें
     }
     }
     स्वयं लौटें;
     return self;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>उपरोक्त उदाहरण में, ध्यान दें <code>id</code> वापसी का प्रकार। यह प्रकार उद्देश्य सी में किसी भी वस्तु के सूचक के लिए खड़ा है (गतिशील टाइपिंग अनुभाग देखें)।
 
उपरोक्त उदाहरण में, ध्यान दें <code>id</code> वापसी का प्रकार। यह प्रकार Objective-C में किसी भी वस्तु के सूचक के लिए खड़ा है (#Dynamic टाइपिंग अनुभाग देखें)।


इनिशियलाइज़र पैटर्न का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को उसके सुपरक्लास द्वारा ठीक से इनिशियलाइज़ किया जाता है, इससे पहले कि इनिट मेथड अपना इनिशियलाइज़ेशन करता है। यह निम्नलिखित क्रियाएं करता है:
इनिशियलाइज़र पैटर्न का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को उसके सुपरक्लास द्वारा ठीक से इनिशियलाइज़ किया जाता है, इससे पहले कि इनिट मेथड अपना इनिशियलाइज़ेशन करता है। यह निम्नलिखित क्रियाएं करता है:


* लाइन 2
* लाइन 2
*: सुपरक्लास उदाहरण को एक init संदेश भेजता है और स्वयं को परिणाम प्रदान करता है (वर्तमान वस्तु के लिए सूचक)।
*: सुपरक्लास उदाहरण को एन आई टी संदेश भेजता है और स्वयं को परिणाम प्रदान करता है (वर्तमान वस्तु के लिए सूचक)।
*पंक्ति 3
*पंक्ति 3
*: जाँचता है कि क्या लौटाया गया ऑब्जेक्ट पॉइंटर किसी भी इनिशियलाइज़ेशन को करने से पहले वैध है।
*: जाँचता है कि क्या लौटाया गया ऑब्जेक्ट पॉइंटर किसी भी इनिशियलाइज़ेशन को करने से पहले वैध है।
Line 290: Line 272:
*: कॉल करने वाले को स्वयं का मान लौटाता है।
*: कॉल करने वाले को स्वयं का मान लौटाता है।


एक गैर-वैध ऑब्जेक्ट पॉइंटर का मान शून्य होता है; सशर्त बयान जैसे अगर शून्य को शून्य सूचक की तरह मानते हैं, तो प्रारंभिक कोड को निष्पादित नहीं किया जाएगा {{code|[super init]}} शून्य लौटा। यदि इनिशियलाइज़ेशन में कोई त्रुटि है, तो इनिट मेथड को कोई भी आवश्यक सफाई करनी चाहिए, जिसमें स्वयं को एक रिलीज़ संदेश भेजना शामिल है, और यह इंगित करने के लिए कि इनिशियलाइज़ेशन विफल हो गया है, वापस लौटें। ऐसी त्रुटियों के लिए कोई भी जाँच केवल सुपरक्लास इनिशियलाइज़ेशन को कॉल करने के बाद ही की जानी चाहिए ताकि यह सुनिश्चित हो सके कि वस्तु को नष्ट करना सही तरीके से किया जाएगा।
गैर-वैध प्रतिरूप पॉइंटर का मान शून्य होता है; सशर्त बात जैसे अगर शून्य को शून्य सूचक की तरह मानते हैं, तो प्रारंभिक कोड को निष्पादित नहीं किया जाएगा {{code|[super init]}} शून्य लौटा। यदि इनिशियलाइज़ेशन में कोई त्रुटि है, तो इनिट मेथड को कोई भी आवश्यक सफाई करनी चाहिए, जिसमें स्वयं को रिलीज़ संदेश भेजना सम्मिलित है, और यह इंगित करने के लिए कि इनिशियलाइज़ेशन विफल हो गया है, वापस लौटें। ऐसी त्रुटियों के लिए कोई भी जाँच केवल सुपरक्लास इनिशियलाइज़ेशन को कॉल करने के बाद ही की जानी चाहिए ताकि यह सुनिश्चित हो सके कि वस्तु को नष्ट करना सही विधियों से किया जाएगा।


यदि किसी वर्ग में एक से अधिक इनिशियलाइज़ेशन मेथड हैं, तो उनमें से केवल एक (नामित इनिशियलाइज़र) को इस पैटर्न का पालन करने की आवश्यकता है; दूसरों को सुपरक्लास इनिशियलाइज़र के बजाय नामित इनिशियलाइज़र को कॉल करना चाहिए।
यदि किसी वर्ग में एक से अधिक इनिशियलाइज़ेशन मेथड हैं, तो उनमें से केवल (नामित इनिशियलाइज़र) को इस पैटर्न का पालन करने की आवश्यकता है; दूसरों को सुपरक्लास इनिशियलाइज़र के अतिरिक्त नामित इनिशियलाइज़र को कॉल करना चाहिए।


=== प्रोटोकॉल ===
=== प्रोटोकॉल ===
अन्य प्रोग्रामिंग भाषाओं में, इन्हें इंटरफेस कहा जाता है।
अन्य प्रोग्रामिंग भाषाओं में, इन्हें इंटरफेस कहा जाता है।


[[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] की शुरुआत के माध्यम से विनिर्देशन की एकाधिक विरासत की अवधारणा को पेश करने के लिए ऑब्जेक्टिव-सी को NeXT में विस्तारित किया गया था, लेकिन कार्यान्वयन नहीं। यह एक ऐसा पैटर्न है जिसे या तो C++ में एक एब्स्ट्रैक्ट मल्टीपल इनहेरिटेड बेस क्लास के रूप में, या एक इंटरफ़ेस के रूप में प्राप्त किया जा सकता है (जैसा कि Java और C Sharp (प्रोग्रामिंग लैंग्वेज)|C#) में है। ऑब्जेक्टिव-सी तदर्थ प्रोटोकॉल का उपयोग करता है जिसे अनौपचारिक प्रोटोकॉल कहा जाता है और कंपाइलर-लागू प्रोटोकॉल जिसे औपचारिक प्रोटोकॉल कहा जाता है।
[[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] की प्रारंभ के माध्यम से विनिर्देशन की एकाधिक विरासत की अवधारणा को प्रस्तुत करने के लिए ऑब्जेक्टिव-सी को नेक्स्ट में विस्तारित किया गया था, लेकिन कार्यान्वयन नहीं। यह ऐसा पैटर्न है जिसे या तो सी++ में एब्स्ट्रैक्ट मल्टीपल इनहेरिटेड बेस क्लास के रूप में, या एक इंटरफ़ेस के रूप में प्राप्त किया जा सकता है (जैसा कि जावा और सी सार्प (प्रोग्रामिंग भाषा)|सी#) में है। ऑब्जेक्टिव-सी तदर्थ प्रोटोकॉल का उपयोग करता है जिसे अनौपचारिक प्रोटोकॉल कहा जाता है और कंपाइलर-प्रयुक्त प्रोटोकॉल जिसे औपचारिक प्रोटोकॉल कहा जाता है।


एक अनौपचारिक प्रोटोकॉल विधियों की एक सूची है जिसे एक वर्ग लागू करने का विकल्प चुन सकता है। यह दस्तावेज़ीकरण में निर्दिष्ट है, क्योंकि इसकी भाषा में कोई उपस्थिति नहीं है। अनौपचारिक प्रोटोकॉल एनएसओब्जेक्ट पर ऑब्जेक्टिव-सी#श्रेणियों (नीचे देखें) के रूप में लागू किए जाते हैं और अक्सर वैकल्पिक तरीकों को शामिल करते हैं, जो लागू होने पर, कक्षा के व्यवहार को बदल सकते हैं। उदाहरण के लिए, एक टेक्स्ट फ़ील्ड क्लास में एक [[प्रतिनिधिमंडल (प्रोग्रामिंग)]] हो सकता है जो उपयोगकर्ता द्वारा टाइप किए गए टेक्स्ट को स्वत: पूर्ण करने के लिए एक वैकल्पिक विधि के साथ एक अनौपचारिक प्रोटोकॉल लागू करता है। पाठ क्षेत्र पता लगाता है कि क्या प्रतिनिधि उस विधि को लागू करता है ([[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] के माध्यम से) और, यदि ऐसा है, तो स्वत: पूर्ण सुविधा का समर्थन करने के लिए प्रतिनिधि की विधि को कॉल करता है।
अनौपचारिक प्रोटोकॉल विधियों की सूची है जिसे वर्ग प्रयुक्त करने का विकल्प चुन सकता है। यह दस्तावेज़ीकरण में निर्दिष्ट है, क्योंकि इसकी भाषा में कोई उपस्थिति नहीं है। अनौपचारिक प्रोटोकॉल एनएसओब्जेक्ट पर ऑब्जेक्टिव-सी श्रेणियों (नीचे देखें) के रूप में प्रयुक्त किए जाते हैं और अधिकांशतः वैकल्पिक विधियों को सम्मिलित करते हैं, जो प्रयुक्त होने पर, कक्षा के व्यवहार को बदल सकते हैं। उदाहरण के लिए, टेक्स्ट फ़ील्ड क्लास में [[प्रतिनिधिमंडल (प्रोग्रामिंग)]] हो सकता है जो उपयोगकर्ता द्वारा टाइप किए गए टेक्स्ट को स्वत: पूर्ण करने के लिए वैकल्पिक विधि के साथ अनौपचारिक प्रोटोकॉल प्रयुक्त करता है। पाठ क्षेत्र पता लगाता है कि क्या प्रतिनिधि उस विधि को प्रयुक्त करता है ([[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] के माध्यम से) और, यदि ऐसा है, तो स्वत: पूर्ण सुविधा का समर्थन करने के लिए प्रतिनिधि की विधि को कॉल करता है।


एक औपचारिक प्रोटोकॉल Java, C#, और Ada (प्रोग्रामिंग भाषा) में एक [[इंटरफ़ेस (कंप्यूटर विज्ञान)]] के समान है। यह उन तरीकों की एक सूची है जिसे कोई भी वर्ग लागू करने के लिए खुद को घोषित कर सकता है। 2.0 से पहले ऑब्जेक्टिव-सी के संस्करणों के लिए आवश्यक है कि एक वर्ग को एक प्रोटोकॉल में सभी तरीकों को लागू करना चाहिए जिसे वह खुद को अपनाने के रूप में घोषित करता है; यदि कक्षा अपने घोषित प्रोटोकॉल से प्रत्येक विधि को लागू नहीं करती है तो संकलक एक त्रुटि का उत्सर्जन करेगा। उद्देश्य-सी 2.0 वैकल्पिक प्रोटोकॉल में कुछ विधियों को चिह्नित करने के लिए समर्थन जोड़ा गया है, और संकलक वैकल्पिक तरीकों के कार्यान्वयन को लागू नहीं करेगा।
औपचारिक प्रोटोकॉल जावा, सी, और अदा (प्रोग्रामिंग भाषा) में [[इंटरफ़ेस (कंप्यूटर विज्ञान)]] के समान है। यह उन विधियों की सूची है जिसे कोई भी वर्ग प्रयुक्त करने के लिए खुद को घोषित कर सकता है। 2.0 से पहले ऑब्जेक्टिव-सी के संस्करणों के लिए आवश्यक है कि वर्ग को प्रोटोकॉल में सभी विधियों को प्रयुक्त करना चाहिए जिसे वह खुद को अपनाने के रूप में घोषित करता है; यदि कक्षा अपने घोषित प्रोटोकॉल से प्रत्येक विधि को प्रयुक्त नहीं करती है तो संकलक त्रुटि का उत्सर्जन करेगा। उद्देश्य-सी 2.0 वैकल्पिक प्रोटोकॉल में कुछ विधियों को चिह्नित करने के लिए समर्थन जोड़ा गया है, और संकलक वैकल्पिक विधियों के कार्यान्वयन को प्रयुक्त नहीं करेगा।


उस प्रोटोकॉल को लागू करने के लिए कहा जाने वाला एक वर्ग घोषित किया जाना चाहिए। यह रनटाइम पर पता लगाने योग्य है। औपचारिक प्रोटोकॉल कोई कार्यान्वयन प्रदान नहीं कर सकते हैं; वे केवल कॉल करने वालों को आश्वस्त करते हैं कि प्रोटोकॉल के अनुरूप कक्षाएं कार्यान्वयन प्रदान करेंगी। NeXT/Apple लाइब्रेरी में, दूरस्थ सिस्टम पर निष्पादित ऑब्जेक्ट की क्षमताओं का प्रतिनिधित्व करने के लिए वितरित ऑब्जेक्ट सिस्टम द्वारा अक्सर प्रोटोकॉल का उपयोग किया जाता है।
उस प्रोटोकॉल को प्रयुक्त करने के लिए कहा जाने वाला वर्ग घोषित किया जाना चाहिए। यह रनटाइम पर पता लगाने योग्य है। औपचारिक प्रोटोकॉल कोई कार्यान्वयन प्रदान नहीं कर सकते हैं; वे केवल कॉल करने वालों को आश्वस्त करते हैं कि प्रोटोकॉल के अनुरूप कक्षाएं कार्यान्वयन प्रदान करेंगी। नेक्स्ट/एप्पल लाइब्रेरी में, दूरस्थ प्रणाली पर निष्पादित ऑब्जेक्ट की क्षमताओं का प्रतिनिधित्व करने के लिए वितरित ऑब्जेक्ट प्रणाली द्वारा अधिकांशतः प्रोटोकॉल का उपयोग किया जाता है।<syntaxhighlight>
@protocol NSLocking
- (void)lock;
- (void)unlock;
@end
</syntaxhighlight>


वाक्य रचना
दर्शाता है कि लॉकिंग का अमूर्त विचार है। कक्षा परिभाषा में बताते हुए कि प्रोटोकॉल प्रयुक्त किया गया है,<syntaxhighlight>
 
@interface NSLock : NSObject <NSLocking>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
@protocol एनएसएलॉकिंग
- (शून्य) ताला;
- (शून्य) अनलॉक;
@अंत
</वाक्यविन्यास हाइलाइट>
 
दर्शाता है कि लॉकिंग का अमूर्त विचार है। कक्षा परिभाषा में बताते हुए कि प्रोटोकॉल लागू किया गया है,
 
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
@interface NSLock: NSObject <NSLocking>
// ...
// ...
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>एनएसएलॉक के उदाहरण दावा करते हैं कि वे दो उदाहरण विधियों के लिए कार्यान्वयन प्रदान करेंगे।
 
एनएसएलॉक के उदाहरण दावा करते हैं कि वे दो उदाहरण विधियों के लिए कार्यान्वयन प्रदान करेंगे।


=== [[गतिशील टाइपिंग]] ===
=== [[गतिशील टाइपिंग]] ===
ऑब्जेक्टिव-सी, स्मॉलटॉक की तरह, डायनेमिक टाइपिंग का उपयोग कर सकता है: एक ऑब्जेक्ट को एक संदेश भेजा जा सकता है जो इसके इंटरफ़ेस में निर्दिष्ट नहीं है। यह बढ़े हुए लचीलेपन की अनुमति दे सकता है, क्योंकि यह एक वस्तु को एक संदेश को पकड़ने और एक अलग वस्तु को संदेश भेजने की अनुमति देता है जो संदेश को उचित रूप से प्रतिक्रिया दे सकता है, या इसी तरह संदेश को किसी अन्य वस्तु पर भेज सकता है। इस व्यवहार को संदेश अग्रेषण या प्रतिनिधिमंडल के रूप में जाना जाता है (नीचे देखें)। वैकल्पिक रूप से, संदेश को अग्रेषित नहीं किए जाने की स्थिति में एक त्रुटि हैंडलर का उपयोग किया जा सकता है। यदि कोई वस्तु किसी संदेश को अग्रेषित नहीं करती है, उसका जवाब नहीं देती है, या किसी त्रुटि को संभालती है, तो सिस्टम एक रनटाइम अपवाद उत्पन्न करेगा।<ref>{{cite web|title=Objective-C Runtime Programming Guide|url=https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048-CH105-SW1|publisher=Apple Inc.|access-date=October 21, 2013|archive-url=https://web.archive.org/web/20140404193818/https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048-CH105-SW1|archive-date=April 4, 2014|url-status=live}}</ref> यदि संदेश शून्य (अशक्त वस्तु सूचक) को भेजे जाते हैं, तो उन्हें संकलक विकल्पों के आधार पर चुपचाप अनदेखा कर दिया जाएगा या एक सामान्य अपवाद उठाया जाएगा।
ऑब्जेक्टिव-सी, स्मॉलटॉक की तरह, डायनेमिक टाइपिंग का उपयोग कर सकता है: ऑब्जेक्ट को संदेश भेजा जा सकता है जो इसके इंटरफ़ेस में निर्दिष्ट नहीं है। यह बढ़े हुए लचीलेपन की अनुमति दे सकता है, क्योंकि यह वस्तु को संदेश को पकड़ने और अलग वस्तु को संदेश भेजने की अनुमति देता है जो संदेश को उचित रूप से प्रतिक्रिया दे सकता है, या इसी तरह संदेश को किसी अन्य वस्तु पर भेज सकता है। इस व्यवहार को संदेश अग्रेषण या प्रतिनिधिमंडल के रूप में जाना जाता है (नीचे देखें)। वैकल्पिक रूप से, संदेश को अग्रेषित नहीं किए जाने की स्थिति में त्रुटि हैंडलर का उपयोग किया जा सकता है। यदि कोई वस्तु किसी संदेश को अग्रेषित नहीं करती है, उसका उत्तर नहीं देती है, या किसी त्रुटि को संभालती है, तो प्रणाली रनटाइम अपवाद उत्पन्न करेगा।<ref>{{cite web|title=Objective-C Runtime Programming Guide|url=https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048-CH105-SW1|publisher=Apple Inc.|access-date=October 21, 2013|archive-url=https://web.archive.org/web/20140404193818/https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048-CH105-SW1|archive-date=April 4, 2014|url-status=live}}</ref> यदि संदेश शून्य (अशक्त वस्तु सूचक) को भेजे जाते हैं, तो उन्हें संकलक विकल्पों के आधार पर चुपचाप अनदेखा कर दिया जाएगा या सामान्य अपवाद उठाया जाएगा।
 
स्टेटिक टाइपिंग जानकारी वैकल्पिक रूप से वेरिएबल्स में भी जोड़ी जा सकती है। यह जानकारी तब संकलन समय पर जांची जाती है। निम्नलिखित चार बयानों में तेजी से विशिष्ट प्रकार की जानकारी प्रदान की जाती है। बयान रनटाइम के बराबर हैं, लेकिन अतिरिक्त जानकारी संकलक को प्रोग्रामर को चेतावनी देने की अनुमति देती है यदि पारित तर्क निर्दिष्ट प्रकार से मेल नहीं खाता है।
 
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (शून्य) सेट मायवैल्यू: (आईडी) फू;
</वाक्यविन्यास हाइलाइट>
उपरोक्त कथन में फू किसी भी वर्ग का हो सकता है।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
स्टेटिक टाइपिंग जानकारी वैकल्पिक रूप से वेरिएबल्स में भी जोड़ी जा सकती है। यह जानकारी तब संकलन समय पर जांची जाती है। निम्नलिखित चार बयानों में तेजी से विशिष्ट प्रकार की जानकारी प्रदान की जाती है। बयान रनटाइम के बराबर हैं, लेकिन अतिरिक्त जानकारी संकलक को प्रोग्रामर को चेतावनी देने की अनुमति देती है यदि पारित तर्क निर्दिष्ट प्रकार से मेल नहीं खाता है।<syntaxhighlight>
- (void)setMyValue:(id)foo;
</syntaxhighlight>उपरोक्त कथन में फू किसी भी वर्ग का हो सकता है।<syntaxhighlight>
- (void)setMyValue:(id<NSCopying>)foo;
- (void)setMyValue:(id<NSCopying>)foo;
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>उपरोक्त कथन में, किसी भी वर्ग का उदाहरण हो सकता है जो इसके अनुरूप हो<code>NSसीopying</code>शिष्टाचार।<syntaxhighlight>
उपरोक्त कथन में, फू किसी भी वर्ग का एक उदाहरण हो सकता है जो इसके अनुरूप हो<code>NSCopying</code>शिष्टाचार।
- (void)setMyValue:(NSNumber *)foo;
</syntaxhighlight>उपरोक्त बयान में, फू एनएसनंबर वर्ग का उदाहरण होना चाहिए।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
ऑब्जेक्टिव-सी में, सभी ऑब्जेक्ट्स को पॉइंटर्स के रूप में दर्शाया जाता है, और स्टैटिक इनिशियलाइज़ेशन की अनुमति नहीं है। सबसे सरल वस्तु वह प्रकार है {{tt|id}} ({{tt|objc_obj *}}) इंगित करता है, जिसमें केवल एक आईएसए सूचक है जो इसकी कक्षा का वर्णन करता है। सी से अन्य प्रकार, जैसे मान और स्ट्रक्चर, अपरिवर्तित हैं क्योंकि वे ऑब्जेक्ट प्रणाली का भाग नहीं हैं। यह निर्णय सी++ ऑब्जेक्ट मॉडल से भिन्न है, जहां संरचना और वर्ग संयुक्त हैं।
- (शून्य) सेट मायवैल्यू: (एनएसनंबर *) फू;
</वाक्यविन्यास हाइलाइट>
उपरोक्त बयान में, फू NSNumber वर्ग का एक उदाहरण होना चाहिए।
 
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (void)setMyValue:(NSNumber<NSCopying> *)foo;
</वाक्यविन्यास हाइलाइट>
उपरोक्त कथन में, फू NSNumber वर्ग का एक उदाहरण होना चाहिए, और इसे इसके अनुरूप होना चाहिए<code>NSCopying</code>शिष्टाचार।
 
ऑब्जेक्टिव-सी में, सभी ऑब्जेक्ट्स को पॉइंटर्स के रूप में दर्शाया जाता है, और स्टैटिक इनिशियलाइज़ेशन की अनुमति नहीं है। सबसे सरल वस्तु वह प्रकार है {{tt|id}} ({{tt|objc_obj *}}) इंगित करता है, जिसमें केवल एक आईएसए सूचक है जो इसकी कक्षा का वर्णन करता है। सी से अन्य प्रकार, जैसे मान और स्ट्रक्चर, अपरिवर्तित हैं क्योंकि वे ऑब्जेक्ट सिस्टम का हिस्सा नहीं हैं। यह निर्णय C++ ऑब्जेक्ट मॉडल से भिन्न है, जहां संरचना और वर्ग संयुक्त हैं।


=== अग्रेषण ===
=== अग्रेषण ===
उद्देश्य-सी किसी वस्तु को संदेश भेजने की अनुमति देता है जो प्रतिक्रिया नहीं दे सकता है। संदेश का जवाब देने या बस छोड़ने के बजाय, एक वस्तु संदेश को उस वस्तु को अग्रेषित कर सकती है जो प्रतिक्रिया दे सकती है। अग्रेषण का उपयोग कुछ डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) के कार्यान्वयन को आसान बनाने के लिए किया जा सकता है, जैसे [[पर्यवेक्षक पैटर्न]] या [[प्रॉक्सी पैटर्न]]।
उद्देश्य-सी किसी वस्तु को संदेश भेजने की अनुमति देता है जो प्रतिक्रिया नहीं दे सकता है। संदेश का उत्तर देने या बस छोड़ने के अतिरिक्त, वस्तु संदेश को उस वस्तु को अग्रेषित कर सकती है जो प्रतिक्रिया दे सकती है। अग्रेषण का उपयोग कुछ डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) के कार्यान्वयन को सरल बनाने के लिए किया जा सकता है, जैसे [[पर्यवेक्षक पैटर्न]] या [[प्रॉक्सी पैटर्न]]।


ऑब्जेक्टिव-सी रनटाइम विधियों की एक जोड़ी निर्दिष्ट करता है {{mono|Object}}
ऑब्जेक्टिव-सी रनटाइम विधियों की जोड़ी निर्दिष्ट करता है {{mono|ऑब्जेक्ट}}
* अग्रेषण विधियाँ: <वाक्यविन्यास लैंग = objc>
* अग्रेषण विधियाँ:  
- (retval_t) आगे: (SEL) sel args: (arglist_t) args; // जीसीसी के साथ
<syntaxhighlight>
- (आईडी) आगे: (एसईएल) सेल तर्क: (मार्ग_सूची) तर्क; // NeXT/Apple सिस्टम के साथ</syntaxhighlight>
- (retval_t)forward:(SEL)sel args:(arglist_t)args; // with GCC
* क्रिया के तरीके: <वाक्यविन्यास लैंग = ओबीजेसी>
- (id)forward:(SEL)sel args:(marg_list)args; // with NeXT/Apple systems
- (retval_t) प्रदर्शन वी: (एसईएल) सेल तर्क: (arglist_t) तर्क; // जीसीसी के साथ
</syntaxhighlight>
- (आईडी) प्रदर्शन वी: (एसईएल) सेल तर्क: (मार्ग_सूची) तर्क; // NeXT/Apple सिस्टम के साथ</syntaxhighlight>
* क्रिया के विधियों:
<syntaxhighlight>
- (retval_t)performv:(SEL)sel args:(arglist_t)args; // with GCC
- (id)performv:(SEL)sel args:(marg_list)args; // with NeXT/Apple systems
</syntaxhighlight>


अग्रेषण को लागू करने की इच्छा रखने वाली वस्तु को अग्रेषण व्यवहार को परिभाषित करने के लिए केवल एक नई विधि के साथ अग्रेषण विधि को ओवरराइड करने की आवश्यकता होती है। क्रिया विधि {{mono|performv::}} ओवरराइड करने की आवश्यकता नहीं है, क्योंकि यह विधि चयनकर्ता और तर्कों के आधार पर केवल एक क्रिया करती है। ध्यान दें <code>SEL</code> प्रकार, जो ऑब्जेक्टिव-सी में संदेशों का प्रकार है।
अग्रेषण को प्रयुक्त करने की इच्छा रखने वाली वस्तु को अग्रेषण व्यवहार को परिभाषित करने के लिए केवल नई विधि के साथ अग्रेषण विधि को ओवरराइड करने की आवश्यकता होती है। क्रिया विधि {{mono|performv::}} ओवरराइड करने की आवश्यकता नहीं है, क्योंकि यह विधि चयनकर्ता और तर्कों के आधार पर केवल क्रिया करती है। ध्यान दें <code>SEL</code> प्रकार, जो ऑब्जेक्टिव-सी में संदेशों का प्रकार है।


नोट: ओपनस्टेप, कोको, और जीएनयूस्टेप में, ऑब्जेक्टिव-सी के आमतौर पर उपयोग किए जाने वाले ढांचे, कोई इसका उपयोग नहीं करता है {{mono|Object}} कक्षा। {{code|2=objc|- (void)forwardInvocation:(NSInvocation *)anInvocation}} }} की विधि {{mono|NSObject}} अग्रेषण करने के लिए कक्षा का उपयोग किया जाता है।
नोट: ओपनस्टेप, कोको, और जीएनयूस्टेप में, ऑब्जेक्टिव-सी के सामान्यतः उपयोग किए जाने वाले ढांचे, कोई इसका उपयोग नहीं करता है {{mono|Object}} कक्षा। {{code|2=objc|- (void)forwardInvocation:(NSInvocation *)anInvocation}} }} की विधि {{mono|NSObject}} अग्रेषण करने के लिए कक्षा का उपयोग किया जाता है।


==== उदाहरण ====
==== उदाहरण ====
यहां एक प्रोग्राम का उदाहरण दिया गया है जो अग्रेषण की मूल बातें प्रदर्शित करता है।
यहां प्रोग्राम का उदाहरण दिया गया है जो अग्रेषण की मूल बातें प्रदर्शित करता है।


; फारवर्डर। एच
; फारवर्डर.ए
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात <objc/Object.h>
#import <objc/Object.h>


@इंटरफेस फॉरवर्डर: ऑब्जेक्ट {
@interface Forwarder : Object {
   आईडी प्राप्तकर्ता; // जिस वस्तु को हम संदेश को अग्रेषित करना चाहते हैं।
   id recipient; // The object we want to forward the message to.
}
}


// एक्सेसर के तरीके।
// Accessor methods.
- (आईडी) प्राप्तकर्ता;
- (id)recipient;
- (आईडी) सेट प्राप्तकर्ता: (आईडी) _ प्राप्तकर्ता;
- (id)setRecipient:(id)_recipient;
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


; फारवर्डर.एम
; फारवर्डर.एम
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात फारवर्डर.एच
#import "Forwarder.h"


@कार्यान्वयन फारवर्डर
@implementation Forwarder
- (retval_t) आगे: (SEL) sel args: (arglist_t) args {
- (retval_t)forward:(SEL)sel args:(arglist_t)args {
   /*
   /*
   * जांचें कि प्राप्तकर्ता वास्तव में संदेश का जवाब देता है या नहीं।
   * Check whether the recipient actually responds to the message.
   * यह वांछनीय हो सकता है या नहीं भी हो सकता है, उदाहरण के लिए, यदि कोई प्राप्तकर्ता
   * This may or may not be desirable, for example, if a recipient
   * बदले में संदेश का जवाब नहीं देता है, यह अग्रेषण कर सकता है
   * in turn does not respond to the message, it might do forwarding
   * अपने आप।
   * itself.
   */
   */
   अगर ([प्राप्तकर्ता ने चयनकर्ता को जवाब दिया: सेल]) {
   if ([recipient respondsToSelector:sel]) {
     वापसी [प्राप्तकर्ता प्रदर्शन: एसईएल तर्क: तर्क];
     return [recipient performv:sel args:args];
   } अन्य {
   } else {
     वापसी [स्वयं त्रुटि: प्राप्तकर्ता जवाब नहीं देता];
     return [self error:"Recipient does not respond"];
   }
   }
}
}


- (आईडी) सेट प्राप्तकर्ता: (आईडी) _ प्राप्तकर्ता {
- (id)setRecipient:(id)_recipient {
   [प्राप्तकर्ता ऑटोरिलीज़];
   [recipient autorelease];
   प्राप्तकर्ता = [_प्राप्तकर्ता बनाए रखें];
   recipient = [_recipient retain];
   स्वयं लौटें;
   return self;
}
}


- (आईडी) प्राप्तकर्ता {
- (id)recipient {
   वापसी प्राप्तकर्ता;
   return recipient;
}
}
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


; प्राप्तकर्ता.एच
; प्राप्तकर्ता.एच
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात <objc/Object.h>
#import <objc/Object.h>


// एक साधारण प्राप्तकर्ता वस्तु।
// A simple Recipient object.
@ इंटरफेस प्राप्तकर्ता: ऑब्जेक्ट
@interface Recipient : Object
- (आईडी) हैलो;
- (id)hello;
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


; प्राप्तकर्ता.एम
; प्राप्तकर्ता.एम
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात प्राप्तकर्ता.एच
#import "Recipient.h"


@कार्यान्वयन प्राप्तकर्ता
@implementation Recipient


- (आईडी) हैलो {
- (id)hello {
   प्रिंटफ (प्राप्तकर्ता हैलो कहता है! \ n);
   printf("Recipient says hello!\n");


   स्वयं लौटें;
   return self;
}
}


@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


; मुख्य.एम
; मुख्य.एम
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात फारवर्डर.एच
#import "Forwarder.h"
#आयात प्राप्तकर्ता.एच
#import "Recipient.h"


पूर्णांक मुख्य (शून्य) {
int main(void) {
   फारवर्डर * फारवर्डर = [फॉरवर्डर नया];
   Forwarder *forwarder = [Forwarder new];
   प्राप्तकर्ता * प्राप्तकर्ता = [नया प्राप्तकर्ता];
   Recipient *recipient = [Recipient new];


   [फारवर्डर सेट प्राप्तकर्ता: प्राप्तकर्ता]; // प्राप्तकर्ता सेट करें।
   [forwarder setRecipient:recipient]; // Set the recipient.
   /*
   /*
   * निरीक्षण करें कि फारवर्डर एक हैलो संदेश का जवाब नहीं देता है! यह
   * Observe forwarder does not respond to a hello message! It will
   *अग्रेषित करें। सभी गैर-मान्यता प्राप्त विधियों को अग्रेषित किया जाएगा
   * be forwarded. All unrecognized methods will be forwarded to
   * प्राप्तकर्ता
   * the recipient
   * (यदि प्राप्तकर्ता उन्हें जवाब देता है, जैसा कि फारवर्डर में लिखा गया है)
   * (if the recipient responds to them, as written in the Forwarder)
   */
   */
   [फारवर्डर हैलो];
   [forwarder hello];


   [प्राप्तकर्ता रिलीज];
   [recipient release];
   [फारवर्डर रिलीज];
   [forwarder release];


   वापसी 0;
   return 0;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
====टिप्पणियाँ====
====टिप्पणियाँ====
When compiled using [[GNU Compiler Collection|gcc]], the compiler reports:
जब [[GNU Compiler Collection|जीसीसी]] का उपयोग करके संकलित किया जाता है, तो संकलक रिपोर्ट करता है''':'''
{{sxhl|2=console|
{{sxhl|2=console|
$ gcc -x objective-c -Wno-import Forwarder.m Recipient.m main.m -lobjc
$ gcc -x objective-c -Wno-import Forwarder.m Recipient.m main.m -lobjc
Line 472: Line 435:
$}}
$}}


The compiler is reporting the point made earlier, that {{mono|Forwarder}} does not respond to hello messages. In this circumstance, it is safe to ignore the warning since forwarding was implemented. Running the program produces this output:
संकलक पहले की गई बात की रिपोर्ट कर रहा है, कि  फारवर्डर हैलो संदेशों का उत्तर नहीं देता है। इस परिस्थिति में, अग्रेषण प्रयुक्त होने के बाद से चेतावनी को अनदेखा करना सुरक्षित है। प्रोग्राम चलाने से यह आउटपुट उत्पन्न होता है:
{{sxhl|2=console|
{{sxhl|2=console|
$ ./a.out
$ ./a.out
Line 480: Line 443:


=== श्रेणियाँ ===
=== श्रेणियाँ ===
ऑब्जेक्टिव-सी के डिजाइन के दौरान, मुख्य चिंताओं में से एक बड़े कोड आधारों की अनुरक्षणीयता थी। [[संरचित प्रोग्रामिंग]] दुनिया के अनुभव ने दिखाया था कि कोड को सुधारने के मुख्य तरीकों में से एक इसे छोटे टुकड़ों में तोड़ना था। ऑब्जेक्टिव-सी ने इस प्रक्रिया में मदद करने के लिए स्मॉलटाक कार्यान्वयन से श्रेणियों की अवधारणा को उधार लिया और विस्तारित किया।<ref>{{cite web |url=http://video.google.com/videoplay?docid=-7466310348707586940&ei=0dr7SIe6L46qrgLk7dHsDg&q=Smalltalk-80 |title=ACM SIGGRAPH 1983 Issue 8 - Smalltalk |access-date=October 7, 2008 |url-status=dead |archive-url=https://web.archive.org/web/20090415163318/http://video.google.com/videoplay?docid=-7466310348707586940&ei=0dr7SIe6L46qrgLk7dHsDg&q=Smalltalk-80 |archive-date=April 15, 2009 |df=dmy-all }}</ref>
ऑब्जेक्टिव-सी के डिजाइन के समय, मुख्य चिंताओं में से बड़े कोड आधारों की अनुरक्षणीयता थी। [[संरचित प्रोग्रामिंग]] दुनिया के अनुभव ने दिखाया था कि कोड को सुधारने के मुख्य विधियों में से इसे छोटे टुकड़ों में तोड़ना था। ऑब्जेक्टिव-सी ने इस प्रक्रिया में सहायता करने के लिए स्मॉलटाक कार्यान्वयन से श्रेणियों की अवधारणा को उधार लिया और विस्तारित किया।<ref>{{cite web |url=http://video.google.com/videoplay?docid=-7466310348707586940&ei=0dr7SIe6L46qrgLk7dHsDg&q=Smalltalk-80 |title=ACM SIGGRAPH 1983 Issue 8 - Smalltalk |access-date=October 7, 2008 |url-status=dead |archive-url=https://web.archive.org/web/20090415163318/http://video.google.com/videoplay?docid=-7466310348707586940&ei=0dr7SIe6L46qrgLk7dHsDg&q=Smalltalk-80 |archive-date=April 15, 2009 |df=dmy-all }}</ref>
इसके अलावा, किसी श्रेणी के तरीकों को रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम पर एक वर्ग में जोड़ा जाता है। इस प्रकार, श्रेणियां प्रोग्रामर को किसी मौजूदा वर्ग - एक [[ओपन क्लास (कंप्यूटर प्रोग्रामिंग)]] में विधियों को जोड़ने की अनुमति देती हैं - उस वर्ग को पुन: संकलित करने की आवश्यकता के बिना या इसके स्रोत कोड तक पहुंच भी। उदाहरण के लिए, यदि किसी सिस्टम में इसके स्ट्रिंग कार्यान्वयन में [[बानान चेकर]] नहीं है, तो इसे स्ट्रिंग स्रोत कोड को संशोधित किए बिना जोड़ा जा सकता है।


जब प्रोग्राम चलाया जाता है तो श्रेणियों के भीतर के तरीके एक वर्ग के तरीकों से अप्रभेद्य हो जाते हैं। एक श्रेणी के पास निजी चर सहित कक्षा के भीतर सभी इंस्टेंस चरों तक पूर्ण पहुंच होती है।
इसके अतिरिक्त, किसी श्रेणी के विधियों को रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम पर वर्ग में जोड़ा जाता है। इस प्रकार, श्रेणियां प्रोग्रामर को किसी वर्त्तमान वर्ग - [[ओपन क्लास (कंप्यूटर प्रोग्रामिंग)]] में विधियों को जोड़ने की अनुमति देती हैं - उस वर्ग को पुन: संकलित करने की आवश्यकता के बिना या इसके स्रोत कोड तक पहुंच भी। उदाहरण के लिए, यदि किसी प्रणाली में इसके स्ट्रिंग कार्यान्वयन में [[बानान चेकर]] नहीं है, तो इसे स्ट्रिंग स्रोत कोड को संशोधित किए बिना जोड़ा जा सकता है।


यदि कोई श्रेणी किसी वर्ग में मौजूदा विधि के समान [[विधि हस्ताक्षर]] के साथ एक विधि घोषित करती है, तो श्रेणी की विधि अपनाई जाती है। इस प्रकार श्रेणियां न केवल एक वर्ग में विधियाँ जोड़ सकती हैं, बल्कि मौजूदा विधियों को भी प्रतिस्थापित कर सकती हैं। इस सुविधा का उपयोग अन्य कक्षाओं में उनके तरीकों को फिर से लिखकर बग को ठीक करने के लिए किया जा सकता है, या किसी प्रोग्राम के भीतर कक्षा के व्यवहार में वैश्विक परिवर्तन का कारण बन सकता है। यदि दो श्रेणियों में एक ही नाम के तरीके हैं लेकिन अलग-अलग विधि हस्ताक्षर हैं, तो यह अपरिभाषित है कि किस श्रेणी की विधि को अपनाया गया है।
जब प्रोग्राम चलाया जाता है तो श्रेणियों के अन्दर के विधियों में वर्ग के विधियों से अप्रभेद्य हो जाते हैं। श्रेणी के पास निजी चर सहित कक्षा के अन्दर सभी इंस्टेंस चरों तक पूर्ण पहुंच होती है।


अन्य भाषाओं ने इस सुविधा को विभिन्न तरीकों से जोड़ने का प्रयास किया है। TOM (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज) ने ऑब्जेक्टिव-सी सिस्टम को एक कदम आगे बढ़ाया और वेरिएबल्स को भी जोड़ने की अनुमति दी। अन्य भाषाओं ने इसके बजाय [[प्रोटोटाइप-आधारित प्रोग्रामिंग]]|प्रोटोटाइप-आधारित समाधानों का उपयोग किया है, सबसे उल्लेखनीय [[स्वयं (प्रोग्रामिंग भाषा)]] है।
यदि कोई श्रेणी किसी वर्ग में वर्त्तमान विधि के समान [[विधि हस्ताक्षर]] के साथ विधि घोषित करती है, तो श्रेणी की विधि अपनाई जाती है। इस प्रकार श्रेणियां न केवल वर्ग में विधियाँ जोड़ सकती हैं, बल्कि वर्त्तमान विधियों को भी प्रतिस्थापित कर सकती हैं। इस सुविधा का उपयोग अन्य कक्षाओं में उनके विधियों को फिर से लिखकर बग को ठीक करने के लिए किया जा सकता है, या किसी प्रोग्राम के अन्दर कक्षा के व्यवहार में वैश्विक परिवर्तन का कारण बन सकता है। यदि दो श्रेणियों में एक ही नाम के विधियों हैं लेकिन अलग-अलग विधि हस्ताक्षर हैं, तो यह अपरिभाषित है कि किस श्रेणी की विधि को अपनाया गया है।


C# और Visual Basic.NET भाषाएँ [[विस्तार विधि]]यों के रूप में सतही रूप से समान कार्यक्षमता को लागू करती हैं, लेकिन इनमें कक्षा के निजी चरों तक पहुँच की कमी होती है।<ref>{{cite web |url=https://msdn.microsoft.com/en-us/library/bb383977.aspx |title=Extension Methods (C# Programming Guide) |date=October 2010 |publisher=Microsoft |access-date=July 10, 2011 |archive-url=https://web.archive.org/web/20110711201830/http://msdn.microsoft.com/en-us/library/bb383977.aspx |archive-date=July 11, 2011 |url-status=live }}</ref> [[रूबी (प्रोग्रामिंग भाषा)]] और कई अन्य गतिशील प्रोग्रामिंग भाषाएं तकनीक को [[बंदर पैच]]िंग के रूप में संदर्भित करती हैं।
अन्य भाषाओं ने इस सुविधा को विभिन्न विधियों से जोड़ने का प्रयास किया है। टॉम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा) ने ऑब्जेक्टिव-सी प्रणाली को एक कदम आगे बढ़ाया और वेरिएबल्स को भी जोड़ने की अनुमति दी। अन्य भाषाओं ने इसके अतिरिक्त [[प्रोटोटाइप-आधारित प्रोग्रामिंग]] प्रोटोटाइप-आधारित समाधानों का उपयोग किया है, सबसे उल्लेखनीय [[स्वयं (प्रोग्रामिंग भाषा)]] है।


[[लॉगटॉक]] श्रेणियों की एक अवधारणा को लागू करता है (प्रथम-श्रेणी की संस्थाओं के रूप में) जो ऑब्जेक्टिव-सी श्रेणियों की कार्यक्षमता को कम करता है (लॉगटॉक श्रेणियों को रचना की ठीक-ठाक इकाइयों के रूप में भी इस्तेमाल किया जा सकता है, उदाहरण के लिए नई कक्षाएं या प्रोटोटाइप; विशेष रूप से, एक लॉगटॉक श्रेणी हो सकती है। वस्तुतः किसी भी वर्ग और प्रोटोटाइप द्वारा आयात किया जाता है)।
सी# और विजुअल बेसिक.नेट भाषाएँ [[विस्तार विधि]]यों के रूप में सतही रूप से समान कार्यक्षमता को प्रयुक्त करती हैं, लेकिन इनमें कक्षा के निजी चरों तक पहुँच की कमी होती है।<ref>{{cite web |url=https://msdn.microsoft.com/en-us/library/bb383977.aspx |title=Extension Methods (C# Programming Guide) |date=October 2010 |publisher=Microsoft |access-date=July 10, 2011 |archive-url=https://web.archive.org/web/20110711201830/http://msdn.microsoft.com/en-us/library/bb383977.aspx |archive-date=July 11, 2011 |url-status=live }}</ref> [[रूबी (प्रोग्रामिंग भाषा)]] और कई अन्य गतिशील प्रोग्रामिंग भाषाएं तकनीक को [[बंदर पैच]] के रूप में संदर्भित करती हैं।
 
[[लॉगटॉक]] श्रेणियों की अवधारणा को प्रयुक्त करता है (प्रथम-श्रेणी की संस्थाओं के रूप में) जो ऑब्जेक्टिव-सी श्रेणियों की कार्यक्षमता को कम करता है (लॉगटॉक श्रेणियों को रचना की ठीक-ठाक इकाइयों के रूप में भी प्रयोग किया जा सकता है, उदाहरण के लिए नई कक्षाएं या प्रोटोटाइप; विशेष रूप से, लॉगटॉक श्रेणी हो सकती है। वस्तुतः किसी भी वर्ग और प्रोटोटाइप द्वारा आयात किया जाता है)।


==== श्रेणियों का उदाहरण उपयोग ====
==== श्रेणियों का उदाहरण उपयोग ====
यह उदाहरण एक बनाता है {{mono|Integer}} कक्षा, पहले एक बुनियादी वर्ग को केवल [[विधि (कंप्यूटर विज्ञान)]] के साथ परिभाषित करके, और दो श्रेणियों को जोड़कर, {{mono|Arithmetic}} और {{mono|Display}}, जो मूल वर्ग का विस्तार करते हैं। जबकि श्रेणियां बेस क्लास के निजी डेटा सदस्यों तक पहुंच सकती हैं, इन निजी डेटा सदस्यों को एक्सेसर विधियों के माध्यम से एक्सेस करना अक्सर अच्छा अभ्यास होता है, जो श्रेणियों को बेस क्लास से अधिक स्वतंत्र रखने में मदद करता है। ऐसे एक्सेसर्स को लागू करना श्रेणियों का एक विशिष्ट उपयोग है। दूसरा आधार वर्ग में विधियों को जोड़ने के लिए श्रेणियों का उपयोग करना है। हालांकि, इसे उपवर्ग ओवरराइडिंग के लिए श्रेणियों का उपयोग करने के लिए अच्छा अभ्यास नहीं माना जाता है, जिसे मंकी पैचिंग भी कहा जाता है। अनौपचारिक प्रोटोकॉल को आधार पर एक श्रेणी के रूप में लागू किया जाता है {{mono|NSObject}} कक्षा। परिपाटी के अनुसार, बेस क्लास का विस्तार करने वाली श्रेणियों वाली फाइलों का नाम <u>BaseClass+ExtensionClass.h</u> होगा।
यह उदाहरण एक बनाता है {{mono|पूर्णांक}} कक्षा, पहले बुनियादी वर्ग को केवल [[विधि (कंप्यूटर विज्ञान)]] के साथ परिभाषित करके, और दो श्रेणियों को जोड़कर, {{mono|अंकगणित}} और {{mono|दिखाना}}, जो मूल वर्ग का विस्तार करते हैं। जबकि श्रेणियां बेस क्लास के निजी डेटा सदस्यों तक पहुंच सकती हैं, इन निजी डेटा सदस्यों को एक्सेसर विधियों के माध्यम से एक्सेस करना अधिकांशतः अच्छा अभ्यास होता है, जो श्रेणियों को बेस क्लास से अधिक स्वतंत्र रखने में सहायता करता है। ऐसे एक्सेसर्स को प्रयुक्त करना श्रेणियों का विशिष्ट उपयोग है। दूसरा आधार वर्ग में विधियों को जोड़ने के लिए श्रेणियों का उपयोग करना है। चुकी, इसे उपवर्ग ओवरराइडिंग के लिए श्रेणियों का उपयोग करने के लिए अच्छा अभ्यास नहीं माना जाता है, जिसे मंकी पैचिंग भी कहा जाता है। अनौपचारिक प्रोटोकॉल को आधार पर श्रेणी के रूप में प्रयुक्त किया जाता है {{mono|एनएसओब्जेक्ट}} कक्षा। परिपाटी के अनुसार, बेस क्लास का विस्तार करने वाली श्रेणियों वाली फाइलों का नाम बेसक्लास+एक्सटेंशनक्लास.एच होगा।


; पूर्णांक। एच
; पूर्णांक.एच
: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात <objc/Object.h>
#import <objc/Object.h>


@इंटरफेस इंटीजर: ऑब्जेक्ट {
@interface Integer : Object {
   इंट पूर्णांक;
   int integer;
}
}


- (इंट) पूर्णांक;
- (int)integer;
- (आईडी) पूर्णांक: (इंट) _ पूर्णांक;
- (id)integer:(int)_integer;
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
:


; पूर्णांक.एम
; पूर्णांक.एम
: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात पूर्णांक.एच
#import "Integer.h"


@कार्यान्वयन पूर्णांक
@implementation Integer
- (इंट) पूर्णांक {
- (int) integer {
   वापसी पूर्णांक;
   return integer;
}
}


- (आईडी) पूर्णांक: (इंट) _पूर्णांक {
- (id) integer: (int) _integer {
   पूर्णांक = _पूर्णांक;
   integer = _integer;
   स्वयं लौटें;
   return self;
}
}
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


; पूर्णांक+अंकगणित.एच
; पूर्णांक+अंकगणित.एच
: <वाक्यविन्यास लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात पूर्णांक.एच
#import "Integer.h"


@interface पूर्णांक (अंकगणित)
@interface Integer (Arithmetic)
- (आईडी) जोड़ें: (पूर्णांक *) जोड़;
- (id) add: (Integer *) addend;
- (आईडी) उप: (पूर्णांक *) सबट्रेंड;
- (id) sub: (Integer *) subtrahend;
@अंत
@end
</वाक्यविन्यास हाइलाइट>
 
</syntaxhighlight>


; पूर्णांक+अंकगणित.m
; पूर्णांक+अंकगणित.m
: <वाक्यविन्यास लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात पूर्णांक+अंकगणित.एच
#import "Integer+Arithmetic.h"


@कार्यान्वयन पूर्णांक (अंकगणित)
@implementation Integer (Arithmetic)
- (आईडी) जोड़ें: (पूर्णांक *) जोड़ {
- (id) add: (Integer *) addend {
   वापसी [स्वयं पूर्णांक: [स्वयं पूर्णांक] + [पूर्णांक जोड़ें;
   return [self integer: [self integer] + [addend integer]];
}
}


- (आईडी) उप: (पूर्णांक *) सबट्रेंड {
- (id) sub: (Integer *) subtrahend {
   वापसी [स्वयं पूर्णांक: [स्वयं पूर्णांक] - [सबट्रेंड पूर्णांक;
   return [self integer: [self integer] - [subtrahend integer]];
}
}
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
:


; पूर्णांक+डिस्प्ले.एच
; पूर्णांक+डिस्प्ले.एच
: <वाक्यविन्यास लैंग = ओबीजेसी>
; <syntaxhighlight>
#आयात पूर्णांक.एच
#import "Integer.h"


@interface पूर्णांक (प्रदर्शन)
@interface Integer (Display)
- (आईडी) शोस्टार;
- (id) showstars;
- (आईडी) दिखावा;
- (id) showint;
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


; पूर्णांक+डिस्प्ले.एम
; पूर्णांक+डिस्प्ले.एम
: <वाक्यविन्यास लैंग = ओबीजेसी>
; <syntaxhighlight>
# आयात पूर्णांक + प्रदर्शन। एच
# import "Integer+Display.h"


@कार्यान्वयन पूर्णांक (प्रदर्शन)
@implementation Integer (Display)
- (आईडी) शोस्टार {
- (id) showstars {
   int i, x = [स्वयं पूर्णांक];
   int i, x = [self integer];
   के लिए (i = 0; i <x; i++) {
   for (i = 0; i < x; i++) {
     प्रिंटफ (*);
     printf("*");
   }
   }
   प्रिंटफ (\n);
   printf("\n");


   स्वयं लौटें;
   return self;
}
}


- (आईडी) दिखाना {
- (id) showint {
   प्रिंटफ (% डी \ n, [स्वयं पूर्णांक]);
   printf("%d\n", [self integer]);


   स्वयं लौटें;
   return self;
}
}
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
:


; मुख्य.एम
; मुख्य.एम
: <वाक्यविन्यास लैंग = ओबीजेसी लाइन>
; <syntaxhighlight>
#आयात पूर्णांक.एच
#import "Integer.h"
#आयात पूर्णांक+अंकगणित.एच
#import "Integer+Arithmetic.h"
#आयात पूर्णांक+प्रदर्शन.एच
#import "Integer+Display.h"


पूर्णांक मुख्य (शून्य) {
int main(void) {
   पूर्णांक * अंक 1 = [पूर्णांक नया], * अंक 2 = [पूर्णांक नया];
   Integer *num1 = [Integer new], *num2 = [Integer new];
   इंट एक्स;
   int x;


   प्रिंटफ (एक पूर्णांक दर्ज करें:);
   printf("Enter an integer: ");
   स्कैनफ (% डी, & एक्स);
   scanf("%d", &x);


   [संख्या 1 पूर्णांक: x];
   [num1 integer:x];
   [संख्या 1 शोस्टार्स];
   [num1 showstars];


   प्रिंटफ (एक पूर्णांक दर्ज करें:);
   printf("Enter an integer: ");
   स्कैनफ (% डी, & एक्स);
   scanf("%d", &x);


   [संख्या 2 पूर्णांक: x];
   [num2 integer:x];
   [संख्या 2 शोस्टार्स];
   [num2 showstars];


   [संख्या 1 जोड़ें: संख्या 2];
   [num1 add:num2];
   [संख्या 1 प्रदर्शन];
   [num1 showint];


   वापसी 0;
   return 0;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
:
====टिप्पणियाँ====
====टिप्पणियाँ====
Compilation is performed, for example, by:
संकलन किया जाता है, उदाहरण के लिए, द्वारा:
{{sxhl|2=console|$ gcc -x objective-c main.m Integer.m Integer+Arithmetic.m Integer+Display.m -lobjc}}
{{sxhl|2=console|$ gcc -x objective-c main.m Integer.m Integer+Arithmetic.m Integer+Display.m -lobjc}}


One can experiment by leaving out the {{code|2=objc|#import "Integer+Arithmetic.h"}} (line 2) and {{code|2=objc|[num1 add:num2]}} (line 21) and omitting {{mono|Integer+Arithmetic.m}} in compilation. The program will still run. This means that it is possible to ''mix-and-match'' added categories if needed; if a category does not need to have some ability, it can simply not be compile in.
को छोड़कर प्रयोग कर सकते हैं {{code|2=objc|#import "Integer+Arithmetic.h"}} (line 2) and {{code|2=objc|[num1 add:num2]}} (line 21) and omitting {{mono|Integer+Arithmetic.m}} in compilation.कार्यक्रम अभी भी चलेगा। इसका अर्थ यह है कि यदि आवश्यक हो तो अतिरिक्त श्रेणियों को मिलाना और मिलाना संभव है; यदि किसी श्रेणी में कुछ क्षमता की आवश्यकता नहीं है, तो उसे संकलित नहीं किया जा सकता है.




=== पोज देना ===
ऑब्जेक्टिव-सी एक क्लास को प्रोग्राम के भीतर दूसरी क्लास को पूरी तरह से बदलने की अनुमति देता है। प्रतिस्थापन वर्ग को लक्ष्य वर्ग के रूप में कहा जाता है।


क्लास पोज़िंग को Mac OS X v10.5 के साथ बहिष्कृत घोषित किया गया था, और 64-बिट रनटाइम में अनुपलब्ध है। इसी तरह की कार्यक्षमता श्रेणियों में विधि स्विज़लिंग का उपयोग करके प्राप्त की जा सकती है, जो एक विधि के कार्यान्वयन को दूसरे के साथ स्वैप करती है जिसमें समान हस्ताक्षर होते हैं।
=== पोजिंग ===
ऑब्जेक्टिव-सी एक क्लास को प्रोग्राम के अन्दर दूसरी क्लास को पूरी तरह से बदलने की अनुमति देता है। प्रतिस्थापन वर्ग को लक्ष्य वर्ग के रूप में कहा जाता है।
 
क्लास पोज़िंग को मैक ओयस एक्स वी10.5 के साथ बहिष्कृत घोषित किया गया था, और 64-बिट रनटाइम में अनुपलब्ध है। इसी तरह की कार्यक्षमता श्रेणियों में विधि स्विज़लिंग का उपयोग करके प्राप्त की जा सकती है, जो विधि के कार्यान्वयन को दूसरे के साथ स्वैप करती है जिसमें समान हस्ताक्षर होते हैं।


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


इसी तरह श्रेणियों के साथ प्रस्तुत करना, मौजूदा वर्गों के वैश्विक संवर्द्धन की अनुमति देता है। पोज़िंग परमिट दो सुविधाओं को श्रेणियों से अनुपस्थित करता है:
इसी तरह श्रेणियों के साथ प्रस्तुत करना, वर्त्तमान वर्गों के वैश्विक संवर्द्धन की अनुमति देता है। पोज़िंग परमिट दो सुविधाओं को श्रेणियों से अनुपस्थित करता है:
* प्रस्तुत वर्ग सुपर के माध्यम से ओवरराइड विधियों को कॉल कर सकता है, इस प्रकार लक्ष्य वर्ग के कार्यान्वयन को शामिल कर सकता है।
* प्रस्तुत वर्ग सुपर के माध्यम से ओवरराइड विधियों को कॉल कर सकता है, इस प्रकार लक्ष्य वर्ग के कार्यान्वयन को सम्मिलित कर सकता है।
* एक पोज़िंग क्लास श्रेणियों में परिभाषित विधियों को ओवरराइड कर सकती है।
* पोज़िंग क्लास श्रेणियों में परिभाषित विधियों को ओवरराइड कर सकती है।


उदाहरण के लिए,


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
उदाहरण के लिए,<syntaxhighlight>
@ इंटरफेस कस्टमएनएसएप्लीकेशन: एनएसएप्लीकेशन
@interface CustomNSApplication : NSApplication
@अंत
@end


@कार्यान्वयन CustomNSAplication
@implementation CustomNSApplication
- (शून्य) सेटमेनमेनू: (एनएसमेनू*) मेनू {
- (void) setMainMenu: (NSMenu*) menu {
   // मेनू के साथ कुछ करें
   // do something with menu
}
}
@अंत
@end


class_poseAs ([कस्टमएनएसएप्लीकेशन क्लास], [एनएसएप्लीकेशन क्लास]);
class_poseAs ([CustomNSApplication class], [NSApplication class]);
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


यह सेटमेनमेनू के एनएसएप्लिकेशंस के प्रत्येक आमंत्रण को रोकता है।
यह सेटमेनमेनू के एनएसएप्लिकेशंस के प्रत्येक सामान्यंत्रण को रोकता है।


=== # आयात ===
=== आयात ===
सी भाषा में, <code>#include</code> पूर्व-संकलन निर्देश हमेशा उस बिंदु पर फ़ाइल की सामग्री को स्रोत में डालने का कारण बनता है। ऑब्जेक्टिव-सी में है <code>#import</code> निर्देश, समतुल्य सिवाय इसके कि प्रत्येक फ़ाइल को प्रति संकलन इकाई में केवल एक बार शामिल किया जाता है, जिसमें गार्ड शामिल करने की आवश्यकता को कम किया जाता है।
सी भाषा में, <code>#include</code> पूर्व-संकलन निर्देश हमेशा उस बिंदु पर फ़ाइल की सामग्री को स्रोत में डालने का कारण बनता है। ऑब्जेक्टिव-सी में है <code>#import</code> निर्देश, समतुल्य अतिरिक्त प्रत्येक फ़ाइल को प्रति संकलन इकाई में केवल एक बार सम्मिलित किया जाता है, जिसमें गार्ड सम्मिलित करने की आवश्यकता को कम किया जाता है।


===लिनक्स जीसीसी संकलन ===
===लिनक्स जीसीसी संकलन ===
 
<syntaxhighlight>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
// FILE: hello.m
// फ़ाइल: हैलो.एम
#import <Foundation/Foundation.h>
#आयात <फाउंडेशन/फाउंडेशन.एच>
int main (int argc, const char * argv[])
int main (int argc, const char * argv[])
{
{
     /* ऑब्जेक्टिव-सी में मेरा पहला प्रोग्राम */
     /* my first program in Objective-C */
     एनएसएलओजी (@ हैलो, वर्ल्ड! \n);
     NSLog(@"Hello, World! \n");
     वापसी 0;
     return 0;
}
}
</syntaxhighlight><syntaxhighlight>
$ # Compile Command Line for gcc and MinGW Compiler:
$ gcc \
    $(gnustep-config --objc-flags) \
    -o hello \
    hello.m \
    -L /GNUstep/System/Library/Libraries \
    -lobjc \
    -lgnustep-base


</वाक्यविन्यास हाइलाइट>
$ ./hello
 
</syntaxhighlight>
<वाक्यविन्यास लैंग = शेल-सत्र>
$ # gcc और MinGW कंपाइलर के लिए कंपाइल कमांड लाइन:
$ जीसीसी \
    $(gnusstep-config --objc-flags) \
    -ओ हैलो \
    हेलो.एम \
    -एल /जीएनयूस्टेप/सिस्टम/लाइब्रेरी/लाइब्रेरी \
    -लोबजेसी \
    -lgnustep-आधार
 
$ ./नमस्ते
</वाक्यविन्यास हाइलाइट>
 
== अन्य विशेषताएं ==
== अन्य विशेषताएं ==
ऑब्जेक्टिव-सी की विशेषताएं अक्सर प्रोग्रामिंग मुद्दों के लिए लचीले और अक्सर आसान समाधान की अनुमति देती हैं।
ऑब्जेक्टिव-सी की विशेषताएं अधिकांशतः प्रोग्रामिंग मुद्दों के लिए लचीले और अधिकांशतः आसान समाधान की अनुमति देती हैं।
* श्रेणियों और संदेश अग्रेषण का उपयोग करके अन्य वस्तुओं और दूरस्थ प्रक्रिया कॉल के लिए प्रतिनिधि विधियों को आसानी से लागू किया जा सकता है।
* श्रेणियों और संदेश अग्रेषण का उपयोग करके अन्य वस्तुओं और दूरस्थ प्रक्रिया कॉल के लिए प्रतिनिधि विधियों को सरलता से प्रयुक्त किया जा सकता है।
* <var>isa</var> पॉइंटर का [[सूचक झूल रहा है]] कक्षाओं को रनटाइम में बदलने की अनुमति देता है। आमतौर पर [[डिबगिंग]] के लिए उपयोग किया जाता है जहां मुक्त वस्तुओं को ज़ोंबी वस्तुओं में घुमा दिया जाता है जिसका एकमात्र उद्देश्य किसी त्रुटि की रिपोर्ट करना है जब कोई उन्हें कॉल करता है। स्विज़लिंग का उपयोग [[एंटरप्राइज़ ऑब्जेक्ट फ्रेमवर्क]] में डेटाबेस दोष बनाने के लिए भी किया गया था।{{citation needed|date=August 2015}} [[की-वैल्यू ऑब्जर्विंग]] को लागू करने के लिए Apple के फाउंडेशन फ्रेमवर्क द्वारा आज स्विज़लिंग का उपयोग किया जाता है।
* <var>isa</var> पॉइंटर का [[सूचक झूल रहा है]] कक्षाओं को रनटाइम में बदलने की अनुमति देता है। सामान्यतः [[डिबगिंग]] के लिए उपयोग किया जाता है जहां मुक्त वस्तुओं को ज़ोंबी वस्तुओं में घुमा दिया जाता है जिसका एकमात्र उद्देश्य किसी त्रुटि की रिपोर्ट करना है जब कोई उन्हें कॉल करता है। स्विज़लिंग का उपयोग [[एंटरप्राइज़ ऑब्जेक्ट फ्रेमवर्क]] में डेटाबेस दोष बनाने के लिए भी किया गया था। [[की-वैल्यू ऑब्जर्विंग]] को प्रयुक्त करने के लिए एप्पल के फाउंडेशन फ्रेमवर्क द्वारा आज स्विज़लिंग का उपयोग किया जाता है।


== भाषा प्रकार ==
== भाषा प्रकार ==


=== उद्देश्य-सी ++ ===
=== उद्देश्य-सी ++ ===
Objective-C++ GNU Compiler Collection और Clang के फ्रंट-एंड द्वारा स्वीकार किया गया एक भाषा संस्करण है, जो C++ और Objective-C सिंटैक्स के संयोजन का उपयोग करने वाली स्रोत फ़ाइलों को संकलित कर सकता है। ऑब्जेक्टिव-सी++ सी++ में वे एक्सटेंशन जोड़ता है जो ऑब्जेक्टिव-सी सी में जोड़ता है। जैसा कि विभिन्न भाषा सुविधाओं के पीछे शब्दार्थ को एकीकृत करने के लिए कुछ भी नहीं किया जाता है, कुछ प्रतिबंध लागू होते हैं:
उद्देश्य सी++ जीएनयू संकलक संग्रह और बजना के फ्रंट-एंड द्वारा स्वीकार किया गया भाषा संस्करण है, जो सी++ और उद्देश्य सी सिंटैक्स के संयोजन का उपयोग करने वाली स्रोत फ़ाइलों को संकलित कर सकता है। ऑब्जेक्टिव-सी++ सी++ में वे एक्सटेंशन जोड़ता है जो ऑब्जेक्टिव-सी सी में जोड़ता है। जैसा कि विभिन्न भाषा सुविधाओं के पीछे शब्दार्थ को एकीकृत करने के लिए कुछ भी नहीं किया जाता है, कुछ प्रतिबंध प्रयुक्त होते हैं:
* एक सी ++ क्लास ऑब्जेक्टिव-सी क्लास से प्राप्त नहीं हो सकती है और इसके विपरीत।
* सी ++ क्लास ऑब्जेक्टिव-सी क्लास से प्राप्त नहीं हो सकती है और इसके विपरीत।
* सी ++ नेमस्पेस को उद्देश्य-सी घोषणा के अंदर घोषित नहीं किया जा सकता है।
* सी ++ नेमस्पेस को उद्देश्य-सी घोषणा के अंदर घोषित नहीं किया जा सकता है।
* उद्देश्य-सी घोषणाएं केवल वैश्विक दायरे में दिखाई दे सकती हैं, सी ++ नेमस्पेस के अंदर नहीं
* उद्देश्य-सी घोषणाएं केवल वैश्विक दायरे में दिखाई दे सकती हैं, सी ++ नेमस्पेस के अंदर नहीं
* उद्देश्य-सी कक्षाओं में सी ++ कक्षाओं के आवृत्ति चर नहीं हो सकते हैं जिनमें [[डिफ़ॉल्ट कंस्ट्रक्टर]] की कमी है या जिनमें एक या अधिक वर्चुअल विधियां हैं,{{citation needed|date=November 2013}} लेकिन सी ++ ऑब्जेक्ट्स के पॉइंटर्स को प्रतिबंध के बिना उदाहरण चर के रूप में उपयोग किया जा सकता है (उन्हें -इनिट विधि में नए के साथ आवंटित करें)।
* उद्देश्य-सी कक्षाओं में सी ++ कक्षाओं के आवृत्ति चर नहीं हो सकते हैं जिनमें [[डिफ़ॉल्ट कंस्ट्रक्टर]] की कमी है या जिनमें एक या अधिक वर्चुअल विधियां हैं, लेकिन सी ++ ऑब्जेक्ट्स के पॉइंटर्स को प्रतिबंध के बिना उदाहरण चर के रूप में उपयोग किया जा सकता है (उन्हें -इनिट विधि में नए के साथ आवंटित करें)।
* C++ by value semantics को Objective-C ऑब्जेक्ट्स पर लागू नहीं किया जा सकता है, जो केवल पॉइंटर्स के माध्यम से एक्सेस किए जा सकते हैं।
* सी++ मूल्य शब्दार्थ द्वारा को उद्देश्य सी ऑब्जेक्ट्स पर प्रयुक्त नहीं किया जा सकता है, जो केवल पॉइंटर्स के माध्यम से एक्सेस किए जा सकते हैं।
* एक उद्देश्य-सी घोषणा सी ++ टेम्पलेट घोषणा के भीतर नहीं हो सकती है और इसके विपरीत। हालांकि, ऑब्जेक्टिव-सी टाइप (जैसे, {{code|Classname *}}) का उपयोग C++ टेम्पलेट पैरामीटर के रूप में किया जा सकता है।
* उद्देश्य-सी घोषणा सी ++ टेम्पलेट घोषणा के अन्दर नहीं हो सकती है और इसके विपरीत। चुकी, ऑब्जेक्टिव-सी टाइप (जैसे, {{code|कक्षा का नाम }}) का उपयोग सी++ टेम्पलेट पैरामीटर के रूप में किया जा सकता है।
* ऑब्जेक्टिव-सी और सी++ एक्सेप्शन हैंडलिंग अलग है; प्रत्येक के संचालक दूसरे प्रकार के अपवादों को संभाल नहीं सकते। नतीजतन, वस्तु विनाशक नहीं चलाए जाते हैं। हाल के ऑब्जेक्टिव-सी 2.0 रनटाइम में इसे कम किया गया है क्योंकि ऑब्जेक्टिव-सी अपवादों को या तो पूरी तरह से (ऐप्पल रनटाइम) सी ++ अपवादों द्वारा प्रतिस्थापित किया जाता है, या आंशिक रूप से जब ऑब्जेक्टिव-सी ++ लाइब्रेरी जुड़ा हुआ है (जीएनयूस्टेप libobjc2)।<ref>{{cite web|url=https://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/TP30001163-CH10-SW1|title=Using C++ With Objective-C|archive-url=https://web.archive.org/web/20100905100849/http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/TP30001163-CH10-SW1 |archive-date=September 5, 2010 |access-date=February 10, 2010|work=Mac OS X Reference Library}}</ref>
* ऑब्जेक्टिव-सी और सी++ एक्सेप्शन हैंडलिंग अलग है; प्रत्येक के संचालक दूसरे प्रकार के अपवादों को संभाल नहीं सकते। परिणामस्वरुप , वस्तु विनाशक नहीं चलाए जाते हैं। हाल के ऑब्जेक्टिव-सी 2.0 रनटाइम में इसे कम किया गया है क्योंकि ऑब्जेक्टिव-सी अपवादों को या तो पूरी तरह से (ऐप्पल रनटाइम) सी ++ अपवादों द्वारा प्रतिस्थापित किया जाता है, या आंशिक रूप से जब ऑब्जेक्टिव-सी ++ लाइब्रेरी जुड़ा हुआ है (जीएनयूस्टेप libobjc2)।<ref>{{cite web|url=https://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/TP30001163-CH10-SW1|title=Using C++ With Objective-C|archive-url=https://web.archive.org/web/20100905100849/http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/TP30001163-CH10-SW1 |archive-date=September 5, 2010 |access-date=February 10, 2010|work=Mac OS X Reference Library}}</ref>
* ऑब्जेक्टिव-सी ब्लॉक और C++11 बेनामी फंक्शन#C++ (C++11 के बाद से) अलग-अलग संस्थाएं हैं। हालाँकि, एक लैम्ब्डा पास करते समय macOS पर एक ब्लॉक पारदर्शी रूप से उत्पन्न होता है जहाँ एक ब्लॉक की उम्मीद होती है।<ref>{{cite web |url=https://clang.llvm.org/docs/LanguageExtensions.html#interoperability-with-c-11-lambdas |title=Clang Language Extensions — Clang 3.5 documentation |publisher=Clang.llvm.org |access-date=April 16, 2014 |archive-url=https://web.archive.org/web/20140224002333/http://clang.llvm.org/docs/LanguageExtensions.html#interoperability-with-c-11-lambdas |archive-date=February 24, 2014 |url-status=live }}</ref>
* ऑब्जेक्टिव-सी ब्लॉक और सी++11 बेनामी फलन सी++ (सी++11 के बाद से) अलग-अलग संस्थाएं हैं। चुकीं, लैम्ब्डा पास करते समय मैक ओएस पर ब्लॉक पारदर्शी रूप से उत्पन्न होता है जहाँ ब्लॉक की उम्मीद होती है।<ref>{{cite web |url=https://clang.llvm.org/docs/LanguageExtensions.html#interoperability-with-c-11-lambdas |title=Clang Language Extensions — Clang 3.5 documentation |publisher=Clang.llvm.org |access-date=April 16, 2014 |archive-url=https://web.archive.org/web/20140224002333/http://clang.llvm.org/docs/LanguageExtensions.html#interoperability-with-c-11-lambdas |archive-date=February 24, 2014 |url-status=live }}</ref>




=== उद्देश्य-सी 2.0 ===
=== उद्देश्य-सी 2.0 ===
2006 के [[विश्वव्यापी डेवलपर्स सम्मेलन]] में, Apple ने Objective-C 2.0 को जारी करने की घोषणा की, Objective-C भाषा का एक संशोधन जिसमें आधुनिक कचरा संग्रह, सिंटैक्स संवर्द्धन,<ref>{{cite web |url=http://lists.apple.com/archives/Objc-language/2006/Aug/msg00039.html |title=Objective-C 2.0: more clues |publisher=Lists.apple.com |date=August 10, 2006 |access-date=May 30, 2010 |archive-url=https://web.archive.org/web/20090618184513/http://lists.apple.com/archives/Objc-language/2006/Aug/msg00039.html |archive-date=June 18, 2009 |url-status=dead }}</ref> रनटाइम प्रदर्शन में सुधार,<ref>{{cite web |url=http://lists.apple.com/archives/Objc-language/2006/Aug/msg00018.html |title=Re: Objective-C 2.0 |publisher=Lists.apple.com |access-date=May 30, 2010 |archive-url=https://web.archive.org/web/20101124014332/http://lists.apple.com/archives/Objc-language/2006/Aug/msg00018.html |archive-date=November 24, 2010 |url-status=dead }}</ref> और 64-बिट समर्थन। Mac OS X v10.5, अक्टूबर 2007 में जारी किया गया, जिसमें एक ऑब्जेक्टिव-सी 2.0 कंपाइलर शामिल था। GNU कम्पाइलर संग्रह|GCC 4.6 कई नई ऑब्जेक्टिव-सी सुविधाओं का समर्थन करता है, जैसे कि घोषित और संश्लेषित गुण, डॉट सिंटैक्स, तेज़ गणना, वैकल्पिक प्रोटोकॉल विधियाँ, विधि/प्रोटोकॉल/क्लास विशेषताएँ, क्लास एक्सटेंशन, और एक नया GNU ऑब्जेक्टिव-सी रनटाइम एपीआई .<ref name=gcc46>{{cite web|url=https://gcc.gnu.org/gcc-4.6/changes.html|title=GCC 4.6 Release Series — Changes, New Features, and Fixes : GNU Project : Free Software Foundation|website=Gcc.gnu.org|access-date=December 24, 2017|archive-url=https://web.archive.org/web/20180105084039/http://gcc.gnu.org/gcc-4.6/changes.html|archive-date=January 5, 2018|url-status=live}}</ref>
2006 के [[विश्वव्यापी डेवलपर्स सम्मेलन]] में, एप्पल ने उद्देश्य सी 2.0 को जारी करने की घोषणा की, उद्देश्य सी भाषा का संशोधन जिसमें आधुनिक कचरा संग्रह, सिंटैक्स संवर्द्धन,<ref>{{cite web |url=http://lists.apple.com/archives/Objc-language/2006/Aug/msg00039.html |title=Objective-C 2.0: more clues |publisher=Lists.apple.com |date=August 10, 2006 |access-date=May 30, 2010 |archive-url=https://web.archive.org/web/20090618184513/http://lists.apple.com/archives/Objc-language/2006/Aug/msg00039.html |archive-date=June 18, 2009 |url-status=dead }}</ref> रनटाइम प्रदर्शन में सुधार,<ref>{{cite web |url=http://lists.apple.com/archives/Objc-language/2006/Aug/msg00018.html |title=Re: Objective-C 2.0 |publisher=Lists.apple.com |access-date=May 30, 2010 |archive-url=https://web.archive.org/web/20101124014332/http://lists.apple.com/archives/Objc-language/2006/Aug/msg00018.html |archive-date=November 24, 2010 |url-status=dead }}</ref> और 64-बिट समर्थन। मैक ओयस एक्स वी10.5, अक्टूबर 2007 में प्रयुक्त किया गया, जिसमें ऑब्जेक्टिव-सी 2.0 कंपाइलर सम्मिलित था। जीएनयू कम्पाइलर संग्रह जीसीसी 4.6 कई नई ऑब्जेक्टिव-सी सुविधाओं का समर्थन करता है, जैसे कि घोषित और संश्लेषित गुण, डॉट सिंटैक्स, तेज़ गणना, वैकल्पिक प्रोटोकॉल विधियाँ, विधि प्रोटोकॉल क्लास विशेषताएँ, क्लास एक्सटेंशन, और नया जीएनयू ऑब्जेक्टिव-सी रनटाइम एपीआई .<ref name=gcc46>{{cite web|url=https://gcc.gnu.org/gcc-4.6/changes.html|title=GCC 4.6 Release Series — Changes, New Features, and Fixes : GNU Project : Free Software Foundation|website=Gcc.gnu.org|access-date=December 24, 2017|archive-url=https://web.archive.org/web/20180105084039/http://gcc.gnu.org/gcc-4.6/changes.html|archive-date=January 5, 2018|url-status=live}}</ref>
नामकरण ऑब्जेक्टिव-सी 2.0 भाषा के संस्करण प्रणाली में एक विराम का प्रतिनिधित्व करता है, क्योंकि NeXT के लिए अंतिम ऑब्जेक्टिव-सी संस्करण objc4 था।<ref name="objc2-faq">{{cite web |title=ObjC2 FAQ |url=http://wiki.gnustep.org/index.php/ObjC2_FAQ |website=GNUstep |access-date=6 January 2020}}</ref> इस प्रोजेक्ट का नाम [[Mac OS X Leopard]] (10.5) में लीगेसी ऑब्जेक्टिव-सी रनटाइम सोर्स कोड की पिछली रिलीज़ में रखा गया था।<ref>{{cite web |title=Source Browser: objc4, 756.2 |url=https://opensource.apple.com/source/objc4/objc4-756.2/ |website=Apple Open Source |access-date=6 January 2020}}</ref>
 
नामकरण ऑब्जेक्टिव-सी 2.0 भाषा के संस्करण प्रणाली में विराम का प्रतिनिधित्व करता है, क्योंकि नेक्स्ट के लिए अंतिम ऑब्जेक्टिव-सी संस्करण ऑब्जेक्टिव था।<ref name="objc2-faq">{{cite web |title=ObjC2 FAQ |url=http://wiki.gnustep.org/index.php/ObjC2_FAQ |website=GNUstep |access-date=6 January 2020}}</ref> इस प्रोजेक्ट का नाम [[Mac OS X Leopard|मैक ओयस एक्स लेओपोर्ड]] (10.5) में लीगेसी ऑब्जेक्टिव-सी रनटाइम सोर्स कोड की पिछली रिलीज़ में रखा गया था।<ref>{{cite web |title=Source Browser: objc4, 756.2 |url=https://opensource.apple.com/source/objc4/objc4-756.2/ |website=Apple Open Source |access-date=6 January 2020}}</ref>
 




==== कचरा संग्रह ====
==== कचरा संग्रह ====
उद्देश्य-सी 2.0 ने एक वैकल्पिक रूढ़िवादी, पीढ़ीगत [[कचरा संग्रह (कंप्यूटर विज्ञान)]] प्रदान किया। जब बैकवर्ड-संगत मोड में चलाया जाता है, तो रनटाइम [[संदर्भ गिनती]] ऑपरेशंस जैसे रिटेन और रिलीज को नो-ऑप्स में बदल देता है। कचरा संग्रह सक्षम होने पर सभी ऑब्जेक्ट कचरा संग्रह के अधीन थे। अंतर्निहित राइट-बैरियर कंपाइलर इंटरसेप्ट्स को ट्रिगर करने के लिए नियमित सी पॉइंटर्स को __strong के साथ योग्य किया जा सकता है और इस प्रकार कचरा संग्रह में भाग लेते हैं।<ref>[https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcAPI.html Garbage Collection Programming Guide: Garbage Collection API] {{Webarchive|url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcAPI.html |date=June 9, 2012 }} (Apple developer website - search for "__strong")</ref> एक शून्य-इंग कमजोर सबसिस्टम भी प्रदान किया गया था जैसे कि __weak के रूप में चिह्नित पॉइंटर्स शून्य पर सेट होते हैं जब ऑब्जेक्ट (या अधिक सरलता से, GC मेमोरी) एकत्र किया जाता है। ऑब्जेक्टिव-सी 2.0 के आईओएस कार्यान्वयन पर कचरा संग्रहकर्ता मौजूद नहीं है।<ref>{{cite web |url=https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Introduction.html |title=Garbage Collection Programming Guide: Introduction to Garbage Collection |publisher=Apple Inc. |date=October 3, 2011 |access-date=December 23, 2011 |archive-url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Introduction.html |archive-date=June 9, 2012 |url-status=live }}</ref> ऑब्जेक्टिव-सी में कचरा संग्रह कम प्राथमिकता वाले पृष्ठभूमि थ्रेड पर चलता है, और उपयोगकर्ता अनुभव को उत्तरदायी रखने के इरादे से उपयोगकर्ता ईवेंट पर रोक सकता है।<ref>{{cite web|url=https://developer.apple.com/leopard/overview/objectivec2.html |title=Leopard Technology Series for Developers: Objective-C 2.0 Overview |publisher=Apple Inc. |date=November 6, 2007 |access-date=May 30, 2010|archive-url=https://web.archive.org/web/20100724195423/http://developer.apple.com/leopard/overview/objectivec2.html |archive-date=July 24, 2010}}</ref>
उद्देश्य-सी 2.0 ने वैकल्पिक रूढ़िवादी, पीढ़ीगत [[कचरा संग्रह (कंप्यूटर विज्ञान)]] प्रदान किया। जब बैकवर्ड-संगत मोड में चलाया जाता है, तो रनटाइम [[संदर्भ गिनती]] ऑपरेशंस जैसे रिटेन और रिलीज को नो-ऑप्स में बदल देता है। कचरा संग्रह सक्षम होने पर सभी ऑब्जेक्ट कचरा संग्रह के अधीन थे। अंतर्निहित राइट-बैरियर कंपाइलर इंटरसेप्ट्स को ट्रिगर करने के लिए नियमित सी पॉइंटर्स को मजबूत के साथ योग्य किया जा सकता है और इस प्रकार कचरा संग्रह में भाग लेते हैं।<ref>[https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcAPI.html Garbage Collection Programming Guide: Garbage Collection API] {{Webarchive|url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcAPI.html |date=June 9, 2012 }} (Apple developer website - search for "__strong")</ref> शून्य-इंग कमजोर सबप्रणाली भी प्रदान किया गया था जैसे कि कमजोर के रूप में चिह्नित पॉइंटर्स शून्य पर सेट होते हैं जब ऑब्जेक्ट (या अधिक सरलता से, जीसी मेमोरी) एकत्र किया जाता है। ऑब्जेक्टिव-सी 2.0 के आईओएस कार्यान्वयन पर कचरा संग्रहकर्ता उपस्थित नहीं है।<ref>{{cite web |url=https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Introduction.html |title=Garbage Collection Programming Guide: Introduction to Garbage Collection |publisher=Apple Inc. |date=October 3, 2011 |access-date=December 23, 2011 |archive-url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/GarbageCollection/Introduction.html |archive-date=June 9, 2012 |url-status=live }}</ref> ऑब्जेक्टिव-सी में कचरा संग्रह कम प्राथमिकता वाले पृष्ठभूमि थ्रेड पर चलता है, और उपयोगकर्ता अनुभव को उत्तरदायी रखने के लक्ष्य से उपयोगकर्ता ईवेंट पर रोक सकता है।<ref>{{cite web|url=https://developer.apple.com/leopard/overview/objectivec2.html |title=Leopard Technology Series for Developers: Objective-C 2.0 Overview |publisher=Apple Inc. |date=November 6, 2007 |access-date=May 30, 2010|archive-url=https://web.archive.org/web/20100724195423/http://developer.apple.com/leopard/overview/objectivec2.html |archive-date=July 24, 2010}}</ref>
स्वचालित संदर्भ गणना (एआरसी) के पक्ष में मैक ओएस एक्स v10.8 में कचरा संग्रह बहिष्कृत किया गया था।<ref>{{cite web |url=https://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |title=Transitioning to ARC Release Notes |publisher=Apple Inc. |date=July 17, 2012 |access-date=August 26, 2012 |archive-url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |archive-date=June 9, 2012 |url-status=live }}</ref> [[ARM64]] पर चल रहे [[iOS 7]] पर Objective-C 64-बिट शब्द में से 19 बिट्स का उपयोग रेफरेंस काउंट को टैग किए गए पॉइंटर्स के रूप में स्टोर करने के लिए करता है।<ref>{{cite web |author=Mike Ash |url=https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html |title=Friday Q&A 2013-09-27: ARM64 and You |publisher=mikeash.com |access-date=April 27, 2014 |archive-url=https://web.archive.org/web/20140426201454/https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html |archive-date=April 26, 2014 |url-status=live }}</ref><ref>{{cite web |url=http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html |title=Hamster Emporium: [objc explain&#93;: Non-pointer isa |publisher=Sealiesoftware.com |date=September 24, 2013 |access-date=April 27, 2014 |archive-url=https://web.archive.org/web/20140603110517/http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html |archive-date=June 3, 2014 |url-status=live }}</ref>
 
स्वचालित संदर्भ गणना (एआरसी) के पक्ष में मैक ओएस एक्स वी10.8 में कचरा संग्रह बहिष्कृत किया गया था।<ref>{{cite web |url=https://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |title=Transitioning to ARC Release Notes |publisher=Apple Inc. |date=July 17, 2012 |access-date=August 26, 2012 |archive-url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |archive-date=June 9, 2012 |url-status=live }}</ref> [[ARM64|एआरएम64]] पर चल रहे [[iOS 7|आईओएस 7]] पर उद्देश्य सी 64-बिट शब्द में से 19 बिट्स का उपयोग रेफरेंस काउंट को टैग किए गए पॉइंटर्स के रूप में स्टोर करने के लिए करता है।<ref>{{cite web |author=Mike Ash |url=https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html |title=Friday Q&A 2013-09-27: ARM64 and You |publisher=mikeash.com |access-date=April 27, 2014 |archive-url=https://web.archive.org/web/20140426201454/https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html |archive-date=April 26, 2014 |url-status=live }}</ref><ref>{{cite web |url=http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html |title=Hamster Emporium: [objc explain&#93;: Non-pointer isa |publisher=Sealiesoftware.com |date=September 24, 2013 |access-date=April 27, 2014 |archive-url=https://web.archive.org/web/20140603110517/http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html |archive-date=June 3, 2014 |url-status=live }}</ref>
 




==== गुण ====
==== गुण ====
ऑब्जेक्टिव-सी 2.0 ऐक्सेसर विधियों की पीढ़ी को कॉन्फ़िगर करने के लिए वैकल्पिक विशेषताओं के साथ [[संपत्ति (प्रोग्रामिंग)]] के रूप में उदाहरण चर घोषित करने के लिए एक नया सिंटैक्स पेश करता है। गुण, एक अर्थ में, सार्वजनिक उदाहरण चर हैं; यानी, एक संपत्ति के रूप में एक उदाहरण चर घोषित करना उस संपत्ति के लिए बाहरी कक्षाओं को पहुंच प्रदान करता है (संभवतः सीमित, उदाहरण के लिए केवल पढ़ने के लिए)। एक संपत्ति को केवल पढ़ने के लिए घोषित किया जा सकता है, और भंडारण शब्दार्थ जैसे कि प्रदान किया जा सकता है <code>assign</code>, <code>copy</code> या <code>retain</code>. डिफ़ॉल्ट रूप से, गुणों पर विचार किया जाता है <code>atomic</code>, जिसके परिणामस्वरूप एक ही समय में कई थ्रेड्स को एक्सेस करने से रोकने वाला लॉक हो जाता है। एक संपत्ति के रूप में घोषित किया जा सकता है <code>nonatomic</code>, जो इस लॉक को हटा देता है।
ऑब्जेक्टिव-सी 2.0 ऐक्सेसर विधियों की पीढ़ी को कॉन्फ़िगर करने के लिए वैकल्पिक विशेषताओं के साथ [[संपत्ति (प्रोग्रामिंग)]] के रूप में उदाहरण चर घोषित करने के लिए नया सिंटैक्स प्रस्तुत करता है। गुण, एक अर्थ में, सार्वजनिक उदाहरण चर हैं; यानी, संपत्ति के रूप में उदाहरण चर घोषित करना उस संपत्ति के लिए बाहरी कक्षाओं को पहुंच प्रदान करता है (संभवतः सीमित, उदाहरण के लिए केवल पढ़ने के लिए)। संपत्ति को केवल पढ़ने के लिए घोषित किया जा सकता है, और भंडारण शब्दार्थ जैसे कि प्रदान किया जा सकता है <code>सौंपना</code>, <code>कॉपी</code> या <code>बनाए रखना</code>. डिफ़ॉल्ट रूप से, गुणों पर विचार किया जाता है <code>एटॉमिक</code>, जिसके परिणामस्वरूप एक ही समय में कई थ्रेड्स को एक्सेस करने से रोकने वाला लॉक हो जाता है। संपत्ति के रूप में घोषित किया जा सकता है <code>नोनाएटॉमिक</code>, जो इस लॉक को हटा देता है।<syntaxhighlight>
 
@interface Person : NSObject {
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
@public
@इंटरफेस व्यक्ति: एनएसओब्जेक्ट {
   NSString *name;
@जनता
@private
   एनएसएसटींग * नाम;
   int age;
@निजी
   अंतर आयु;
}
}


@ संपत्ति (प्रतिलिपि) एनएसएसटींग * नाम;
@property(copy) NSString *name;
@ संपत्ति (आसानी से) int उम्र;
@property(readonly) int age;
 
- (आईडी) initWithAge: (int) उम्र;
@अंत
</वाक्यविन्यास हाइलाइट>
 
गुणों के माध्यम से कार्यान्वित किया जाता है <code>@synthesize</code> कीवर्ड, जो संपत्ति घोषणा के अनुसार गेट्टर (और सेटर, यदि केवल पढ़ने के लिए नहीं) तरीके उत्पन्न करता है। वैकल्पिक रूप से, गेट्टर और सेटर विधियों को स्पष्ट रूप से लागू किया जाना चाहिए, या <code>@dynamic</code> कीवर्ड का उपयोग यह इंगित करने के लिए किया जा सकता है कि एक्सेसर विधियां अन्य माध्यमों से प्रदान की जाएंगी। जब क्लैंग 3.1 या उच्चतर का उपयोग करके संकलित किया जाता है, तो सभी गुण जिन्हें स्पष्ट रूप से घोषित नहीं किया जाता है <code>@dynamic</code>, चिह्नित <code>readonly</code> या पूर्ण उपयोगकर्ता-कार्यान्वित गेट्टर है और सेटर स्वचालित रूप से निहित होगा <code>@synthesize</code>'डी।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (id)initWithAge:(int)age;
@ कार्यान्वयन व्यक्ति
@end
@संश्लेषित नाम;
</syntaxhighlight>गुणों के माध्यम से कार्यान्वित किया जाता है <code>@synthesize</code> कीवर्ड, जो संपत्ति घोषणा के अनुसार गेट्टर (और सेटर, यदि केवल पढ़ने के लिए नहीं) विधियों उत्पन्न करता है। वैकल्पिक रूप से, गेट्टर और सेटर विधियों को स्पष्ट रूप से प्रयुक्त किया जाना चाहिए, या <code>@dynamic</code> कीवर्ड का उपयोग यह इंगित करने के लिए किया जा सकता है कि एक्सेसर विधियां अन्य माध्यमों से प्रदान की जाएंगी। जब क्लैंग 3.1 या उच्चतर का उपयोग करके संकलित किया जाता है, तो सभी गुण जिन्हें स्पष्ट रूप से घोषित नहीं किया जाता है <code>@डायनमिक</code>, चिह्नित <code>केवल पढ़ने के लिए</code> या पूर्ण उपयोगकर्ता-कार्यान्वित गेट्टर है और सेटर स्वचालित रूप से निहित होगा <code>@संश्लेषित</code>'डी।<syntaxhighlight>
@implementation Person
@synthesize name;


- (आईडी) initWithAge: (int) initAge {
- (id)initWithAge:(int)initAge {
   स्व = [सुपर इनिट];
   self = [super init];
   अगर (स्वयं) {
   if (self) {
     // नोट: डायरेक्ट इंस्टेंस वेरिएबल असाइनमेंट, प्रॉपर्टी सेटर नहीं
     // NOTE: direct instance variable assignment, not property setter
     उम्र = initAge;
     age = initAge;
   }
   }
   स्वयं लौटें;
   return self;
}
}


- (इंट) उम्र {
- (int)age {
   वापसी की उम्र;
   return age;
}
}
@अंत
@end
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
गुणों को पारंपरिक संदेश पासिंग सिंटैक्स, डॉट नोटेशन, या, की-वैल्यू कोडिंग में, valueForKey: / setValue:forKey: विधियों के माध्यम से नाम से एक्सेस किया जा सकता है।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
गुणों को पारंपरिक संदेश पासिंग सिंटैक्स, डॉट नोटेशन, या, की-वैल्यू कोडिंग में, कुंजी के लिए मूल्य: /सेट कुंजी के लिए मूल्य: विधियों के माध्यम से नाम से एक्सेस किया जा सकता है।<syntaxhighlight>
व्यक्ति *aPerson = व्यक्ति आवंटित] initWithAge:53];
Person *aPerson = [[Person alloc] initWithAge:53];
aPerson.name = @ स्टीव; // नोट: डॉट नोटेशन, संश्लेषित सेटर का उपयोग करता है,
aPerson.name = @"Steve"; // NOTE: dot notation, uses synthesized setter,
                         // [एपर्सन सेटनाम: @ स्टीव] के बराबर;
                         // equivalent to [aPerson setName: @"Steve"];
NSLog(@ संदेश द्वारा एक्सेस (%@), डॉट नोटेशन(%@), संपत्ति का नाम (% @) और
NSLog(@"Access by message (%@), dot notation(%@), property name(% @) and "
        प्रत्यक्ष उदाहरण चर पहुँच (% @) ,
      "direct instance variable access(% @) ",
               [एक व्यक्ति का नाम],
               [aPerson name],
       aPerson.name, [aPerson valueForKey:@ name ], aPerson -> name);
       aPerson.name, [aPerson valueForKey:@"name"], aPerson -> name);
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>उदाहरण विधि के अन्दर संपत्ति एक्सेसर्स को सामान्यंत्रित करने के लिए डॉट नोटेशन का उपयोग करने के लिए, स्वयं कीवर्ड का उपयोग किया जाना चाहिए:<syntaxhighlight>
 
- (void)introduceMyselfWithProperties:(BOOL)useGetter {
एक उदाहरण विधि के भीतर संपत्ति एक्सेसर्स को आमंत्रित करने के लिए डॉट नोटेशन का उपयोग करने के लिए, स्वयं कीवर्ड का उपयोग किया जाना चाहिए:
   NSLog(@"Hi, my name is %@.", (useGetter ? self.name : name));
 
   // NOTE: getter vs. ivar access
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (शून्य) गुणों के साथ मेरा परिचय दें: (बूल) उपयोग गेट्टर {
   NSLog(@ नमस्ते, मेरा नाम %@ है।
   // नोट: गेटर बनाम इवर एक्सेस
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>वर्ग या प्रोटोकॉल के गुण गतिशील रूप से टाइप आत्मनिरीक्षण हो सकते हैं।<syntaxhighlight>
 
int i;
एक वर्ग या प्रोटोकॉल के गुण गतिशील रूप से टाइप आत्मनिरीक्षण हो सकते हैं।
int propertyCount = 0;
 
objc_property_t *propertyList =
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
int मैं;
इंट प्रॉपर्टीकाउंट = 0;
objc_property_t * संपत्ति सूची =
     class_copyPropertyList([aPerson class], &propertyCount);
     class_copyPropertyList([aPerson class], &propertyCount);


के लिए (i = 0; i <propertyCount; i++) {
for (i = 0; i < propertyCount; i++) {
   objc_property_t * यह संपत्ति = संपत्ति सूची + i;
   objc_property_t *thisProperty = propertyList + i;
   const char *propertyName = property_getName(*thisProperty);
   const char *propertyName = property_getName(*thisProperty);
   NSLog(@ व्यक्ति के पास संपत्ति है: '%s' , संपत्तिनाम);
   NSLog(@"Person has a property: '%s'", propertyName);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
==== गैर-नाज़ुक उदाहरण चर ====
==== गैर-नाज़ुक उदाहरण चर ====
ऑब्जेक्टिव-सी 2.0 गैर-नाजुक उदाहरण चर प्रदान करता है जहां रनटाइम द्वारा समर्थित होता है (यानी जब 64-बिट macOS और सभी iOS के लिए बिल्डिंग कोड होता है)आधुनिक रनटाइम के तहत, इंस्टेंस वेरिएबल एक्सेस में इंडिकेशन की एक अतिरिक्त परत जोड़ी जाती है, जिससे डायनेमिक लिंकर को रनटाइम पर इंस्टेंस लेआउट को समायोजित करने की अनुमति मिलती है। यह सुविधा ऑब्जेक्टिव-सी कोड में दो महत्वपूर्ण सुधारों की अनुमति देती है:
ऑब्जेक्टिव-सी 2.0 गैर-नाजुक उदाहरण चर प्रदान करता है जहां रनटाइम द्वारा समर्थित होता है (यानी जब 64-बिट मैक ओएस और सभी आईओएस के लिए बिल्डिंग कोड होता है) आधुनिक रनटाइम के अनुसार, इंस्टेंस वेरिएबल एक्सेस में इंडिकेशन की अतिरिक्त परत जोड़ी जाती है, जिससे डायनेमिक लिंकर को रनटाइम पर इंस्टेंस लेआउट को समायोजित करने की अनुमति मिलती है। यह सुविधा ऑब्जेक्टिव-सी कोड में दो महत्वपूर्ण सुधारों की अनुमति देती है:
* यह [[नाजुक बाइनरी इंटरफ़ेस समस्या]] को समाप्त करता है; सुपरक्लास बाइनरी संगतता को प्रभावित किए बिना आकार बदल सकते हैं।
* यह [[नाजुक बाइनरी इंटरफ़ेस समस्या]] को समाप्त करता है; सुपरक्लास बाइनरी संगतता को प्रभावित किए बिना आकार बदल सकते हैं।
* यह इंस्टेंस वेरिएबल्स की अनुमति देता है जो गुणों को क्लास के इंटरफ़ेस में घोषित किए बिना रनटाइम पर संश्लेषित करने के लिए समर्थन प्रदान करते हैं।
* यह इंस्टेंस वेरिएबल्स की अनुमति देता है जो गुणों को क्लास के इंटरफ़ेस में घोषित किए बिना रनटाइम पर संश्लेषित करने के लिए समर्थन प्रदान करते हैं।


==== फास्ट गणना ====
==== फास्ट गणना ====
एक संग्रह के माध्यम से पुनरावृत्ति करने के लिए NSEnumerator ऑब्जेक्ट या इंडेक्स का उपयोग करने के बजाय, ऑब्जेक्टिव-सी 2.0 तेज़ गणना सिंटैक्स प्रदान करता है। ऑब्जेक्टिव-सी 2.0 में, निम्नलिखित लूप कार्यात्मक रूप से समकक्ष हैं, लेकिन अलग-अलग प्रदर्शन गुण हैं।
संग्रह के माध्यम से पुनरावृत्ति करने के लिए एनएसएन्यूमरेटर ऑब्जेक्ट या इंडेक्स का उपयोग करने के अतिरिक्त, ऑब्जेक्टिव-सी 2.0 तेज़ गणना सिंटैक्स प्रदान करता है। ऑब्जेक्टिव-सी 2.0 में, निम्नलिखित लूप कार्यात्मक रूप से समकक्ष हैं, लेकिन अलग-अलग प्रदर्शन गुण हैं।<syntaxhighlight>
// Using NSEnumerator
NSEnumerator *enumerator = [thePeople objectEnumerator];
Person *p;


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
while ((p = [enumerator nextObject]) != nil) {
// एनएसईन्यूमेरेटर का उपयोग करना
   NSLog(@"%@ is %i years old.", [p name], [p age]);
NSEnumerator *गणक = [पीपुल ऑब्जेक्टएन्यूमरेटर];
व्यक्ति *पी;
 
जबकि ((पी = [एन्यूमरेटर नेक्स्टऑब्जेक्ट])! = शून्य) {
   NSLog(@ %@% i साल पुराना है। , [पी नाम], [पी उम्र]);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight><syntaxhighlight>
 
// Using indexes
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
for (int i = 0; i < [thePeople count]; i++) {
// इंडेक्स का उपयोग करना
   Person *p = [thePeople objectAtIndex:i];
के लिए (int i = 0; i <[लोग गिनती]; i++) {
   NSLog(@"%@ is %i years old.", [p name], [p age]);
   व्यक्ति * पी = [पीपल ऑब्जेक्ट एट इंडेक्स: आई];
   NSLog(@ %@% i साल पुराना है। , [पी नाम], [पी उम्र]);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight><syntaxhighlight>
 
// Using fast enumeration
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
// तेज गणना का उपयोग करना
for (Person *p in thePeople) {
for (Person *p in thePeople) {
   NSLog(@ %@% i साल पुराना है। , [पी नाम], [पी उम्र]);
   NSLog(@"%@ is %i years old.", [p name], [p age]);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


तेज़ गणना मानक गणना की तुलना में अधिक कुशल कोड उत्पन्न करती है क्योंकि वस्तुओं पर गणना करने के लिए विधि कॉल को NSFastEnumeration प्रोटोकॉल का उपयोग करके पॉइंटर अंकगणित द्वारा प्रतिस्थापित किया जाता है।<ref>{{cite web|url=https://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html|title=Fast Enumeration|author=Apple, Inc.|year=2009|publisher=apple.com|access-date=December 31, 2009|archive-url=https://web.archive.org/web/20091217202149/http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html|archive-date=December 17, 2009|url-status=live}}</ref>
तेज़ गणना मानक गणना की तुलना में अधिक कुशल कोड उत्पन्न करती है क्योंकि वस्तुओं पर गणना करने के लिए विधि कॉल को एनएस फास्टएन्यूमरेशन प्रोटोकॉल का उपयोग करके पॉइंटर अंकगणित द्वारा प्रतिस्थापित किया जाता है।<ref>{{cite web|url=https://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html|title=Fast Enumeration|author=Apple, Inc.|year=2009|publisher=apple.com|access-date=December 31, 2009|archive-url=https://web.archive.org/web/20091217202149/http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html|archive-date=December 17, 2009|url-status=live}}</ref>




====कक्षा विस्तार ====
====कक्षा विस्तार ====
एक वर्ग विस्तार में एक श्रेणी घोषणा के समान सिंटैक्स होता है जिसमें कोई श्रेणी नाम नहीं होता है, और इसमें घोषित विधियों और गुणों को सीधे मुख्य वर्ग में जोड़ा जाता है। यह ज्यादातर सार्वजनिक शीर्षकों में विज्ञापन के बिना एक वर्ग में विधियों को जोड़ने के लिए एक श्रेणी के विकल्प के रूप में उपयोग किया जाता है, इस लाभ के साथ कि वर्ग विस्तार के लिए संकलक जाँच करता है कि सभी निजी तौर पर घोषित तरीके वास्तव में लागू किए गए हैं।<ref>{{cite web|url=https://gcc.gnu.org/gcc-4.6/changes.html|title=GCC 4.6 Release Series – Changes, New Features, and Fixes|author=Free Software Foundation, Inc.|year=2011|website=Gcc.gnu.org|access-date=November 27, 2013|archive-url=https://web.archive.org/web/20131202234354/http://gcc.gnu.org/gcc-4.6/changes.html|archive-date=December 2, 2013|url-status=live}}</ref>
वर्ग विस्तार में श्रेणी घोषणा के समान सिंटैक्स होता है जिसमें कोई श्रेणी नाम नहीं होता है, और इसमें घोषित विधियों और गुणों को सीधे मुख्य वर्ग में जोड़ा जाता है। यह अधिकांशतः सार्वजनिक शीर्षकों में विज्ञापन के बिना वर्ग में विधियों को जोड़ने के लिए श्रेणी के विकल्प के रूप में उपयोग किया जाता है, इस लाभ के साथ कि वर्ग विस्तार के लिए संकलक जाँच करता है कि सभी निजी तौर पर घोषित विधियों वास्तव में प्रयुक्त किए गए हैं।<ref>{{cite web|url=https://gcc.gnu.org/gcc-4.6/changes.html|title=GCC 4.6 Release Series – Changes, New Features, and Fixes|author=Free Software Foundation, Inc.|year=2011|website=Gcc.gnu.org|access-date=November 27, 2013|archive-url=https://web.archive.org/web/20131202234354/http://gcc.gnu.org/gcc-4.6/changes.html|archive-date=December 2, 2013|url-status=live}}</ref>




==== कोको के विकास के लिए निहितार्थ ====
==== कोको के विकास के लिए निहितार्थ ====
{{Unreferenced section|date=November 2012}}
मैक ओयस के लिए विकसित सभी ऑब्जेक्टिव-सी एप्लिकेशन जो ऑब्जेक्टिव-सी 2.0 के लिए उपरोक्त सुधारों का उपयोग करते हैं, 10.5 (तेंदुए) से पहले के सभी ऑपरेटिंग प्रणाली के साथ असंगत हैं। चूँकि तेज़ गणना मानक गणना के समान बायनेरिज़ उत्पन्न नहीं करती है, इसके उपयोग से मैक ओएस एक्स संस्करण 10.4 या इससे पहले के संस्करण क्रैश हो जाएंगे।
MacOS के लिए विकसित सभी ऑब्जेक्टिव-सी एप्लिकेशन जो ऑब्जेक्टिव-सी 2.0 के लिए उपरोक्त सुधारों का उपयोग करते हैं, 10.5 (तेंदुए) से पहले के सभी ऑपरेटिंग सिस्टम के साथ असंगत हैं। चूँकि तेज़ गणना मानक गणना के समान बायनेरिज़ उत्पन्न नहीं करती है, इसके उपयोग से मैक ओएस एक्स संस्करण 10.4 या इससे पहले के संस्करण क्रैश हो जाएंगे।


=== ब्लॉक ===
=== ब्लॉक ===
{{Main|Blocks (C language extension)}}
{{Main|ब्लॉक (सी भाषा विस्तार)}}
ब्लॉक उद्देश्य-सी (और सी (प्रोग्रामिंग भाषा) और सी ++) के लिए एक गैर-मानक विस्तार है जो [[क्लोजर (प्रोग्रामिंग)]] बनाने के लिए विशेष सिंटैक्स का उपयोग करता है। ब्लॉक केवल Mac OS X स्नो लेपर्ड|Mac OS X 10.6 स्नो लेपर्ड या बाद के संस्करण, [[iOS 4]] या उसके बाद के संस्करण, और libobjc2 1.7 के साथ GNUstep और क्लैंग 3.1 या बाद के संस्करण के साथ संकलन में समर्थित हैं।<ref name="Blocks requirements">{{cite web |url=https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html |title=Blocks Programming Topics – Mac Developer Library |publisher=Apple Inc. |date=March 8, 2011 |access-date=November 28, 2012 |archive-url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html |archive-date=June 9, 2012 |url-status=live }}</ref>
ब्लॉक उद्देश्य-सी (और सी (प्रोग्रामिंग भाषा) और सी ++) के लिए गैर-मानक विस्तार है जो [[क्लोजर (प्रोग्रामिंग)]] बनाने के लिए विशेष सिंटैक्स का उपयोग करता है। ब्लॉक केवल मैक ओएस एक्स स्नो लेपर्ड| मैक ओएस एक्स 10.6 स्नो लेपर्ड या बाद के संस्करण, [[iOS 4|आईओएस 4]] या उसके बाद के संस्करण, और ली बॉबजेसी2 1.7 के साथ जीएनयूस्टेप और क्लैंग 3.1 या बाद के संस्करण के साथ संकलन में समर्थित हैं।<ref name="Blocks requirements">{{cite web |url=https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html |title=Blocks Programming Topics – Mac Developer Library |publisher=Apple Inc. |date=March 8, 2011 |access-date=November 28, 2012 |archive-url=https://web.archive.org/web/20120609170929/http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html |archive-date=June 9, 2012 |url-status=live }}</ref><syntaxhighlight>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
#include <stdio.h>
#शामिल <stdio.h>
#include <Block.h>
#शामिल <Block.h>
typedef int (^IntBlock)();
टाइपपीफ इंट (^ इंटब्लॉक) ();


इंटब्लॉक मेककाउंटर (इंट स्टार्ट, इंट इंक्रीमेंट) {
IntBlock MakeCounter(int start, int increment) {
   __ ब्लॉक इंट आई = स्टार्ट;
   __block int i = start;


   रिटर्न ब्लॉक_कॉपी ( ^ {
   return Block_copy( ^ {
     int ret = मैं;
     int ret = i;
     मैं + = वेतन वृद्धि;
     i += increment;
     वापसी रिट;
     return ret;
   });
   });


}
}


पूर्णांक मुख्य (शून्य) {
int main(void) {
   इंटब्लॉक मायकाउंटर = मेककाउंटर (5, 2);
   IntBlock mycounter = MakeCounter(5, 2);
   प्रिंटफ (पहली कॉल:% d \ n, मायकाउंटर ());
   printf("First call: %d\n", mycounter());
   प्रिंटफ (दूसरा कॉल:% d \ n, मायकाउंटर ());
   printf("Second call: %d\n", mycounter());
   प्रिंटफ (तीसरा कॉल:% d \ n, मायकाउंटर ());
   printf("Third call: %d\n", mycounter());


   / * क्योंकि इसकी नकल की गई थी, इसे भी जारी किया जाना चाहिए * /
   /* because it was copied, it must also be released */
   ब्लॉक_रिलीज़ (मायकाउंटर);
   Block_release(mycounter);


   वापसी 0;
   return 0;
}
}
/ * आउटपुट:
/* Output:
   पहली कॉल: 5
   First call: 5
   दूसरी कॉल: 7
   Second call: 7
   तीसरी कॉल: 9
   Third call: 9
*/
*/
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
=== आधुनिक उद्देश्य-सी ===
=== आधुनिक उद्देश्य-सी ===
Apple ने समय के साथ ऑब्जेक्टिव 2.0 में कुछ अतिरिक्त सुविधाएँ जोड़ी हैं। जोड़ केवल Apple LLVM कंपाइलर पर लागू होते हैं, यानी भाषा का क्लैंग फ्रंटएंड। भ्रामक रूप से, Apple द्वारा उपयोग किया जाने वाला संस्करण LLVM अपस्ट्रीम से भिन्न होता है; को देखें {{section link|Xcode|Toolchain versions}} ओपन-सोर्स एलएलवीएम संस्करण संख्या में अनुवाद के लिए।<ref name="llvm-ver">{{cite web |title=Objective-C Automatic Reference Counting (ARC) — Clang 11 documentation |url=https://clang.llvm.org/docs/AutomaticReferenceCounting.html |website=Clang documentation |access-date=20 February 2020 |quote=For now, it is sensible to version this document by the releases of its sole implementation (and its host project), clang. “LLVM X.Y” refers to an open-source release of clang from the LLVM project. “Apple X.Y” refers to an Apple-provided release of the Apple LLVM Compiler.}}</ref>
एप्पल ने समय के साथ ऑब्जेक्टिव 2.0 में कुछ अतिरिक्त सुविधाएँ जोड़ी हैं। जोड़ केवल एप्पल एलएलवीएम कंपाइलर पर प्रयुक्त होते हैं, यानी भाषा का क्लैंग फ्रंटएंड। भ्रामक रूप से, एप्पल द्वारा उपयोग किया जाने वाला संस्करण एलएलवीएम अपस्ट्रीम से भिन्न होता है; को देखें {{section link|एक्सकोड|टूलचैन संस्करण}} ओपन-सोर्स एलएलवीएम संस्करण संख्या में अनुवाद के लिए।<ref name="llvm-ver">{{cite web |title=Objective-C Automatic Reference Counting (ARC) — Clang 11 documentation |url=https://clang.llvm.org/docs/AutomaticReferenceCounting.html |website=Clang documentation |access-date=20 February 2020 |quote=For now, it is sensible to version this document by the releases of its sole implementation (and its host project), clang. “LLVM X.Y” refers to an open-source release of clang from the LLVM project. “Apple X.Y” refers to an Apple-provided release of the Apple LLVM Compiler.}}</ref>




==== स्वचालित संदर्भ गणना ====
==== स्वचालित संदर्भ गणना ====
{{main|Automatic Reference Counting}}
{{main|स्वचालित संदर्भ गिनती}}
ऑटोमैटिक रेफरेंस काउंटिंग (ARC) एक कंपाइल-टाइम फीचर है जो प्रोग्रामर्स को मैन्युअल रूप से रिटेन काउंट्स को मैनेज करने की जरूरत को खत्म करता है <code>retain</code> और <code>release</code>.<ref name="Transitioning to ARC">{{cite web|title=Transitioning to ARC|url=https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html|publisher=Apple Inc.|access-date=October 8, 2012|archive-url=https://web.archive.org/web/20110907013839/http://developer.apple.com/library/iOS/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html|archive-date=September 7, 2011|url-status=live}}</ref> कचरा संग्रह (कंप्यूटर विज्ञान) के विपरीत, जो रन टाइम पर होता है, एआरसी एक अलग प्रक्रिया के ऊपरी हिस्से को बनाए रखने की गिनती को प्रबंधित करता है। एआरसी और मैनुअल मेमोरी प्रबंधन परस्पर अनन्य नहीं हैं; प्रोग्रामर एआरसी-सक्षम परियोजनाओं में व्यक्तिगत कोड फ़ाइलों के लिए एआरसी को अक्षम करके गैर-एआरसी कोड का उपयोग करना जारी रख सकते हैं। Xcode किसी प्रोजेक्ट को स्वचालित रूप से ARC में अपग्रेड करने का प्रयास कर सकता है।


एआरसी को एलएलवीएम 3.0 में पेश किया गया था। यह Xcode 4.2 (2011), या Apple LLVM कंपाइलर 3.0 में अनुवाद करता है।<ref>{{cite web |title=LLVM 3.0 Release Notes |url=https://releases.llvm.org/3.0/docs/ReleaseNotes.html |website=releases.llvm.org}}</ref>
ऑटोमैटिक रेफरेंस काउंटिंग (आर्क) कंपाइल-टाइम विशेषता है जो प्रोग्रामर्स को मैन्युअल रूप से रिटेन काउंट्स को मैनेज करने की जरूरत को खत्म करता है <code>retain</code> और <code>release</code>.<ref name="Transitioning to ARC">{{cite web|title=Transitioning to ARC|url=https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html|publisher=Apple Inc.|access-date=October 8, 2012|archive-url=https://web.archive.org/web/20110907013839/http://developer.apple.com/library/iOS/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html|archive-date=September 7, 2011|url-status=live}}</ref> कचरा संग्रह (कंप्यूटर विज्ञान) के विपरीत, जो रन टाइम पर होता है, एआरसी अलग प्रक्रिया के ऊपरी भागों को बनाए रखने की गिनती को प्रबंधित करता है। एआरसी और मैनुअल मेमोरी प्रबंधन परस्पर अनन्य नहीं हैं; प्रोग्रामर एआरसी-सक्षम परियोजनाओं में व्यक्तिगत कोड फ़ाइलों के लिए एआरसी को अक्षम करके गैर-एआरसी कोड का उपयोग करना जारी रख सकते हैं। एक्सकोड किसी प्रोजेक्ट को स्वचालित रूप से आर्क में अपग्रेड करने का प्रयास कर सकता है।
 
एआरसी को एलएलवीएम 3.0 में प्रस्तुत किया गया था। यह एक्सकोड 4.2 (2011), या एप्पल एलएलवीएम कंपाइलर 3.0 में अनुवाद करता है।<ref>{{cite web |title=LLVM 3.0 Release Notes |url=https://releases.llvm.org/3.0/docs/ReleaseNotes.html |website=releases.llvm.org}}</ref>




==== शाब्दिक ====
==== शाब्दिक ====
NeXT और Apple Obj-C रनटाइम में लंबे समय से शाब्दिक सिंटैक्स का उपयोग करके नए तार बनाने का एक छोटा-सा तरीका शामिल है <code>@"a new string"</code>, या CoreFoundation स्थिरांक पर ड्रॉप करें <code>kCFBooleanTrue</code> और <code>kCFBooleanFalse</code> के लिए <code>NSNumber</code> बूलियन मूल्यों के साथ। इस प्रारूप का उपयोग करने से प्रोग्रामर को अधिक समय तक उपयोग करने से बचाया जाता है <code>initWithString</code> या इसी तरह के तरीके कुछ संचालन करते समय।
नेक्स्ट और एप्पल ओब्जेस्टसी रनटाइम में लंबे समय से शाब्दिक सिंटैक्स का उपयोग करके नए तार बनाने का एक छोटा-सा विधि सम्मिलित है <code>@"a new string"</code>, या कोरफाउंडेशन स्थिरांक पर ड्रॉप करें <code>kcFBooleanTrue</code> और <code>kcFBooleanFalse</code> के लिए <code>NSNumber</code> बूलियन मूल्यों के साथ। इस प्रारूप का उपयोग करने से प्रोग्रामर को अधिक समय तक उपयोग करने से बचाया जाता है <code>initWithString</code> या इसी तरह के विधियों कुछ संचालन करते समय।
 
Apple LLVM कंपाइलर 4.0 (Xcode 4.4) या बाद के संस्करण का उपयोग करते समय, सरणियाँ, शब्दकोश और संख्याएँ (<code>NSArray</code>, <code>NSDictionary</code>, <code>NSNumber</code> कक्षाएं) विधियों के बजाय शाब्दिक सिंटैक्स का उपयोग करके भी बनाई जा सकती हैं। <रेफरी नाम = ओब्ज-सी के साथ प्रोग्रामिंग - मान और संग्रह>{{cite web|title=ऑब्जेक्टिव-सी के साथ प्रोग्रामिंग: मूल्य और संग्रह|url=https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html|publisher=Apple Inc.|access-date=October 8, 2012|archive-url=https://web.archive.org/web/20110907013839/http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html|archive-date=September 7, 2011|url-status=live}}</ रेफ> (ऐप्पल एलएलवीएम कंपाइलर 4.0 ओपन सोर्स एलएलवीएम और क्लैंग 3.1 में अनुवाद करता है।) रेफरी नाम = llvm31>{{cite web |title=क्लैंग 3.1 रिलीज नोट्स|url=https://releases.llvm.org/3.1/tools/clang/docs/ReleaseNotes.html |website=releases.llvm.org}}</रेफरी>


शाब्दिक के बिना उदाहरण:
एप्पल एलएलवीएम कंपाइलर 4.0 (एक्सकोड 4.4) या बाद के संस्करण का उपयोग करते समय, सरणियाँ, शब्दकोश और संख्याएँ (<code>NSArray</code>, <code>NSDictionary</code>, <code>NSNumber</code> कक्षाएं) विधियों के अतिरिक्त शाब्दिक सिंटैक्स का उपयोग करके भी बनाई जा सकती हैं। <रेफरी नाम = ओब्ज-सी के साथ प्रोग्रामिंग - मान और संग्रह>{{cite web|title=ऑब्जेक्टिव-सी के साथ प्रोग्रामिंग: मूल्य और संग्रह|url=https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html|publisher=Apple Inc.|access-date=October 8, 2012|archive-url=https://web.archive.org/web/20110907013839/http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html|archive-date=September 7, 2011|url-status=live}}</ रेफ> (ऐप्पल एलएलवीएम कंपाइलर 4.0 ओपन सोर्स एलएलवीएम और क्लैंग 3.1 में अनुवाद करता है।) रेफरी नाम = llvm31>{{cite web |title=क्लैंग 3.1 रिलीज नोट्स|url=https://releases.llvm.org/3.1/tools/clang/docs/ReleaseNotes.html |website=releases.llvm.org}}</रेफरी>


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
शाब्दिक के बिना उदाहरण:<syntaxhighlight>
NSArray * myArray = [NSArray arrayWithObjects: object1, object2, object3, nil];
NSArray *myArray = [NSArray arrayWithObjects:object1,object2,object3,nil];
NSDictionary *myDictionary1 = [NSDictionary dictionaryWithObject: someObject forKey:@ key];
NSDictionary *myDictionary1 = [NSDictionary dictionaryWithObject:someObject forKey:@"key"];
NSDictionary *myDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys: object1, key1, object2, key2, nil];
NSDictionary *myDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:object1, key1, object2, key2, nil];
NSNumber *myNumber = [NSNumber numberWithInt:myInt];
NSNumber *myNumber = [NSNumber numberWithInt:myInt];
NSNumber *mySumNumber= [NSNumber numberWithInt:(2 + 3)];
NSNumber *mySumNumber= [NSNumber numberWithInt:(2 + 3)];
NSNumber *myBoolNumber = [NSNumber numberWithBool:YES];
NSNumber *myBoolNumber = [NSNumber numberWithBool:YES];
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
शाब्दिक के साथ उदाहरण:


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
शाब्दिक के साथ उदाहरण:<syntaxhighlight>
एनएसएआरएआरई * myArray = @ [ऑब्जेक्ट 1, ऑब्जेक्ट 2, ऑब्जेक्ट 3];
NSArray *myArray = @[ object1, object2, object3 ];
NSDictionary *myDictionary1 = @{@ key : someObject };
NSDictionary *myDictionary1 = @{ @"key" : someObject };
NSDictionary *myDictionary2 = @{ key1: object1, key2: object2};
NSDictionary *myDictionary2 = @{ key1: object1, key2: object2 };
NSNumber *myNumber = @(myInt);
NSNumber *myNumber = @(myInt);
NSNumber *mySumNumber = @(2+3);
NSNumber *mySumNumber = @(2+3);
एनएसनंबर * myBoolNumber = @YES;
NSNumber *myBoolNumber = @YES;
एनएसनंबर * myIntegerNumber = @8;
NSNumber *myIntegerNumber = @8;
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


हालाँकि, स्ट्रिंग शाब्दिक से भिन्न, जो निष्पादन योग्य में स्थिरांक के लिए संकलित होते हैं, ये शाब्दिक उपरोक्त विधि कॉल के समतुल्य कोड के लिए संकलित होते हैं। विशेष रूप से, मैन्युअल रूप से संदर्भ-गणना स्मृति प्रबंधन के तहत, इन वस्तुओं को स्वत: रिलीज़ किया जाता है, जिसके लिए अतिरिक्त देखभाल की आवश्यकता होती है, उदाहरण के लिए, फ़ंक्शन-स्थैतिक चर या अन्य प्रकार के ग्लोबल्स के साथ उपयोग किया जाता है।
चुकीं, स्ट्रिंग शाब्दिक से भिन्न, जो निष्पादन योग्य में स्थिरांक के लिए संकलित होते हैं, ये शाब्दिक उपरोक्त विधि कॉल के समतुल्य कोड के लिए संकलित होते हैं। विशेष रूप से, मैन्युअल रूप से संदर्भ-गणना स्मृति प्रबंधन के अनुसार, इन वस्तुओं को स्वत: रिलीज़ किया जाता है, जिसके लिए अतिरिक्त देखभाल की आवश्यकता होती है, उदाहरण के लिए, फलन-स्थैतिक चर या अन्य प्रकार के ग्लोबल्स के साथ उपयोग किया जाता है।


==== सब्सक्रिप्शन ====
==== सब्सक्रिप्शन ====
Apple LLVM कंपाइलर 4.0 या बाद के संस्करण का उपयोग करते समय, सरणियाँ और शब्दकोश (<code>NSArray</code> और <code>NSDictionary</code> क्लासेस) सबस्क्रिप्टिंग का उपयोग करके हेरफेर किया जा सकता है। वस्तुओं को अनुक्रमणिका या कुंजियों पर सेट करने के लिए। कोड में, कोष्ठकों का उपयोग करके सबस्क्रिप्टिंग का प्रतिनिधित्व किया जाता है <code>[ ]</code>.<ref name=ObjCLiterals>{{cite web |url=https://clang.llvm.org/docs/ObjectiveCLiterals.html |title=Objective-C Literals — Clang 3.5 documentation |publisher=Clang.llvm.org |access-date=April 16, 2014 |archive-url=https://web.archive.org/web/20140606050836/http://clang.llvm.org/docs/ObjectiveCLiterals.html |archive-date=June 6, 2014 |url-status=live }}</ref>
एप्पल एलएलवीएम कंपाइलर 4.0 या बाद के संस्करण का उपयोग करते समय, सरणियाँ और शब्दकोश (<code>NSArray</code> और <code>NSDictionary</code> क्लासेस) सबस्क्रिप्टिंग का उपयोग करके हेरफेर किया जा सकता है। वस्तुओं को अनुक्रमणिका या कुंजियों पर सेट करने के लिए। कोड में, कोष्ठकों का उपयोग करके सबस्क्रिप्टिंग का प्रतिनिधित्व किया जाता है <code>[ ]</code>.<ref name=ObjCLiterals>{{cite web |url=https://clang.llvm.org/docs/ObjectiveCLiterals.html |title=Objective-C Literals — Clang 3.5 documentation |publisher=Clang.llvm.org |access-date=April 16, 2014 |archive-url=https://web.archive.org/web/20140606050836/http://clang.llvm.org/docs/ObjectiveCLiterals.html |archive-date=June 6, 2014 |url-status=live }}</ref>
सबस्क्रिप्टिंग के बिना उदाहरण:
 
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
आईडी ऑब्जेक्ट 1 = [कुछ ऐरे ऑब्जेक्टएट इंडेक्स: 0];
आईडी ऑब्जेक्ट 2 = [कुछ डिक्शनरी ऑब्जेक्टफॉरकी: @ कुंजी];
[someMutableArray की जगहObjectAtIndex:0 withObject:object3];
[someMutableDictionary setObject: object4 forKey:@ key];
</वाक्यविन्यास हाइलाइट>


सबस्क्रिप्टिंग के साथ उदाहरण:
सबस्क्रिप्टिंग के बिना उदाहरण:<syntaxhighlight>
id object1 = [someArray objectAtIndex:0];
id object2 = [someDictionary objectForKey:@"key"];
[someMutableArray replaceObjectAtIndex:0 withObject:object3];
[someMutableDictionary setObject:object4 forKey:@"key"]
</syntaxhighlight>


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
सबस्क्रिप्टिंग के साथ उदाहरण:<syntaxhighlight>
आईडी ऑब्जेक्ट 1 = कुछ ऐरे [0];
id object1 = someArray[0];
आईडी ऑब्जेक्ट 2 = कुछ डिक्शनरी [@ कुंजी];
id object2 = someDictionary[@"key"];
someMutableArray[0] = object3;
someMutableArray[0] = object3;
कुछ म्यूटेबल डिक्शनरी [@ कुंजी] = ऑब्जेक्ट 4;
someMutableDictionary[@"key"] = object4;
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


=== आधुनिक ऑब्जेक्टिव-सी सिंटैक्स (1997) ===
=== आधुनिक ऑब्जेक्टिव-सी सिंटैक्स (1997) ===
Apple द्वारा NeXT की खरीद के बाद, स्मॉलटाक की तुलना में [[जावा (प्रोग्रामिंग भाषा)]] से अधिक परिचित प्रोग्रामर्स के लिए भाषा को अधिक स्वीकार्य बनाने का प्रयास किया गया। इन प्रयासों में से एक उस समय का परिचय देना था जिसे उस समय ऑब्जेक्टिव-सी के लिए मॉडर्न सिंटैक्स करार दिया गया था<ref>{{citation |title=Rhapsody Developer's Guide |publisher=AP Professional |year=1997|pages=76–84}}</ref> (वर्तमान, क्लासिक सिंटैक्स के विपरीत)। व्यवहार में कोई बदलाव नहीं आया, यह केवल एक वैकल्पिक वाक्य-विन्यास था। एक विधि आमंत्रण लिखने के बजाय जैसे
एप्पल द्वारा नेक्स्ट की खरीद के बाद, स्मॉलटाक की तुलना में [[जावा (प्रोग्रामिंग भाषा)]] से अधिक परिचित प्रोग्रामर्स के लिए भाषा को अधिक स्वीकार्य बनाने का प्रयास किया गया। इन प्रयासों में से उस समय का परिचय देना था जिसे उस समय ऑब्जेक्टिव-सी के लिए मॉडर्न सिंटैक्स करार दिया गया था<ref>{{citation |title=Rhapsody Developer's Guide |publisher=AP Professional |year=1997|pages=76–84}}</ref> (वर्तमान, क्लासिक सिंटैक्स के विपरीत)। व्यवहार में कोई बदलाव नहीं आया, यह केवल वैकल्पिक वाक्य-विन्यास था। एक विधि सामान्यंत्रण लिखने के अतिरिक्त जैसे<syntaxhighlight>
    object = [[MyClass alloc] init];
    [object firstLabel: param1 secondLabel: param2];
</syntaxhighlight>इसके अतिरिक्त इसे लिखा गया था<syntaxhighlight>
    object = (MyClass.alloc).init;
    object.labels ( param1, param2 );
</syntaxhighlight>इसी तरह, घोषणाएं फॉर्म से चली गईं<syntaxhighlight>
-(void) firstLabel: (int)param1 secondLabel: (int)param2;
</syntaxhighlight>को<syntaxhighlight>
-(void) labels ( int param1, int param2 );
</syntaxhighlight>यह आधुनिक सिंटैक्स अब उद्देश्य सी भाषा की वर्तमान बोलियों में समर्थित नहीं है।
=== मूल-ऑब्जेक्ट ===
[https://mulle-objc.github.io/mulle-objc] प्रोजेक्ट ऑब्जेक्टिव-सी का एक और री-इम्प्लीमेंटेशन है। यह बैकएंड के रूप में जीएनयू कंपाइलर संग्रह या क्लैंग एलएलवीएम कंपाइलर्स का समर्थन करता है। यह सिंटैक्स, शब्दार्थ और एबीआई संगतता के संदर्भ में अन्य रनटाइम से अलग हो जाता है। यह लिनक्स, फ्रीबीएसडी और विंडोज को सपोर्ट करता है।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
=== पोर्टेबल ऑब्जेक्ट कंपाइलर ===
    वस्तु = MyClass आवंटन] init];
जीएनयू कंपाइलर कलेक्शन नेक्स्ट एप्पल इंक. कार्यान्वयन के अतिरिक्त, जिसने मूल स्टेपस्टोन कार्यान्वयन में कई एक्सटेंशन जोड़े, एक और फ्री और ओपन सोर्स सॉफ्टवेयर | फ्री, ओपन-सोर्स ऑब्जेक्टिव-सी कार्यान्वयन जिसे पोर्टेबल ऑब्जेक्ट कंपाइलर कहा जाता है, भी उपस्थित है।<ref>{{cite web |url=http://users.pandora.be/stes/compiler.html |title=Portable Object Compiler |publisher=Users.pandora.be |date=January 1, 1970 |access-date=May 30, 2010 |archive-url=https://web.archive.org/web/20080802040731/http://users.pandora.be/stes/compiler.html |archive-date=August 2, 2008 |url-status=live }}</ref> पोर्टेबल ऑब्जेक्ट कंपाइलर द्वारा प्रयुक्त किए गए एक्सटेंशन का सेट जीसीसी नेक्स्ट एप्पल कार्यान्वयन से अलग है; विशेष रूप से, इसमें ऑब्जेक्टिव-सी के लिए स्मॉलटाक जैसे ब्लॉक सम्मिलित हैं, जबकि इसमें प्रोटोकॉल और श्रेणियों की कमी है, ओपनस्टेप और इसके डेरिवेटिव और रिश्तेदार में बड़े पैमाने पर उपयोग की जाने वाली दो विशेषताएं। कुल मिलाकर, पीओसी भाषा के विकास में पुराने, पूर्व-नेक्स्ट चरण का प्रतिनिधित्व करता है, जो सामान्य तौर पर ब्रैड कॉक्स की 1991 की किताब के अनुरूप है।
    [ऑब्जेक्ट फर्स्ट लेबल: पैराम 1 सेकेंड लेबल: पैराम 2];
</वाक्यविन्यास हाइलाइट>


इसके बजाय इसे लिखा गया था
इसमें ऑब्जेक्टपैक नामक रनटाइम लाइब्रेरी भी सम्मिलित है, जो कॉक्स की मूल आईसी पाक101 लाइब्रेरी पर आधारित है (जो बदले में स्मॉलटाक -80 क्लास लाइब्रेरी से प्राप्त होती है), और ओपनस्टेप फाउंडेशनकिट से काफी अलग है।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
=== जीईओएस उद्देश्य-सी ===
    वस्तु = (MyClass.alloc).init;
[[GEOS (16-बिट ऑपरेटिंग सिस्टम)|जीईओएस (16-बिट ऑपरेटिंग प्रणाली)]] प्रणाली प्रोग्रामिंग भाषा का उपयोग करता है जिसे जीईओएस उद्देश्य सी या जीईओ के रूप में जाना जाता है;<ref>{{cite web |url=http://www.breadbox.com/downloads.asp?id=54&category=GeosSDK&maincategory=SDK |title=Breadbox Computer Company LLC homepage |access-date=December 8, 2010 |archive-url=https://web.archive.org/web/20110727185136/http://www.breadbox.com/downloads.asp?id=54&category=GeosSDK&maincategory=SDK |archive-date=July 27, 2011 |url-status=dead }}</ref> नाम की समानता के अतिरिक्त, दो भाषाएँ केवल समग्र अवधारणा में समान हैं और @ चिन्ह के साथ उपसर्ग वाले कीवर्ड का उपयोग करती हैं।
    ऑब्जेक्ट.लेबल ( param1, param2 );
</वाक्यविन्यास हाइलाइट>


इसी तरह, घोषणाएं फॉर्म से चली गईं
=== बजना ===
क्लैंग कंपाइलर सूट, एलएलवीएम प्रोजेक्ट का भाग, ऑब्जेक्टिव-सी और अन्य भाषाओं को प्रयुक्त करता है। जीसीसी 4.3 (2008) के जीपीएलवी3 में बदलने के बाद, एप्पल ने क्लैंग के पक्ष में इसे छोड़ दिया, कंपाइलर जिसके पास संशोधित करने के लिए अधिक कानूनी शक्ति है। परिणामस्वरुप , आधुनिक ऑब्जेक्टिव-सी भाषा की कई विशेषताएं केवल क्लैंग द्वारा समर्थित हैं।


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
अपने क्लैंग-आधारित एलएलवीएम कंपाइलर के लिए ऐप्पल की वर्जनिंग स्कीम एलएलवीएम के ओपन-सोर्स वर्जनिंग से अलग है। देखना {{section link|एक्सकोड|टूलचैन संस्करण}} अनुवाद के लिए<ref name="llvm-ver"/>
    - (शून्य) पहला लेबल: (int) param1 दूसरा लेबल: (int) param2;
</वाक्यविन्यास हाइलाइट>


को


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
=== जीएनयू, जीएनयूस्टेप, और विनओबीजेसी ===
    - (शून्य) लेबल ( int param1, int param2 );
जीएनयू प्रोजेक्ट, लंबे समय से, नेक्स्ट और ऑब्जेक्टसी प्रोग्राम को पोर्ट करने के लिए प्लेटफॉर्म में रुचि रखता है। के लिए चेंजलॉग {{tt|लीबॉबजेसी}} जीसीसी में निर्देशिका से पता चलता है कि यह 1998 (जीसीसी 2.95) से पहले अस्तित्व में था, और इसके रीडमे ने 1993 (जीसीसी 2.4) में एक पुनर्लेखन पर आगे संकेत किया।<ref>{{cite web |title=gcc/libobjc |url=https://github.com/gcc-mirror/gcc/tree/master/libobjc |website=GitHub |publisher=gcc-mirror |access-date=6 January 2020 |date=6 January 2020 |quote=he runtime has been completely rewritten in gcc 2.4.  The earlier runtime had several severe bugs and was rather incomplete.}}</ref>
</वाक्यविन्यास हाइलाइट>
 
यह आधुनिक सिंटैक्स अब Objective-C भाषा की वर्तमान बोलियों में समर्थित नहीं है।


=== मूल-objc ===
नेक्स्ट फ्रंटएंड सोर्स कोड जारी किया गया था क्योंकि इसे जीसीसी के भागों के रूप में बनाया गया था, जीएनयू पब्लिक लाइसेंस जारी किया गया था जो ऐसा करने के लिए व्युत्पन्न कार्यों को करने के लिए मजबूर करता है। एप्पल ने 4.2.1 तक जीसीसी के अपने फोर्क को जारी करने में इस परंपरा को जारी रखा, जिसके बाद उन्होंने कंपाइलर को छोड़ दिया। जीसीसी अनुरक्षकों ने परिवर्तनों को स्वीकार किया, लेकिन ऑब्जेक्टिव-सी 2.0 भाषा जैसी नई सुविधाओं का समर्थन करने में ज्यादा निवेश नहीं किया।<ref name="objc2-faq" />
[https://mulle-objc.github.io/mulle-objc] प्रोजेक्ट ऑब्जेक्टिव-सी का एक और री-इम्प्लीमेंटेशन है। यह बैकएंड के रूप में जीएनयू कंपाइलर संग्रह या क्लैंग/एलएलवीएम कंपाइलर्स का समर्थन करता है। यह सिंटैक्स, शब्दार्थ और ABI संगतता के संदर्भ में अन्य रनटाइम से अलग हो जाता है। यह Linux, FreeBSD और Windows को सपोर्ट करता है।


=== पोर्टेबल ऑब्जेक्ट कंपाइलर ===
नई भाषा में रुचि रखने वाले जीएनयूस्टेप डेवलपर्स ने जीसीसी को फोर्क किया {{tt|लीबॉबजेसी}} जीसीसी से स्वतंत्र परियोजना के लिए कहा जाता है {{tt|लीबॉबजेसी2}} 2009 में। उन्होंने नई भाषा सिंटैक्स का लाभ उठाने के लिए क्लैंग के साथ रनटाइम के उपयोग की भी व्यवस्था की।<ref name="objc2-faq" /> जीसीसी एक ही समय में धीरे-धीरे चला गया, लेकिन जीसीसी 4.6.0 (2011) में वे ऑब्जेक्टिव-सी 2.0 पर अपने लीबॉबजेसी में भी चले गए हैं।<ref name="gcc46" /><ref>{{cite web |title=GNU Objective-C runtime API |url=https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gcc/GNU-Objective-C-runtime-API.html |website=Using GCC |access-date=6 January 2020}}</ref> जीएनयूस्टेप प्रलेखन सुझाव देता है कि जीसीसी कार्यान्वयन में अभी भी ब्लॉक, गैर-नाजुक चर और नए एआरसी के लिए समर्थन की कमी है।<ref name="objc2-faq" />
जीएनयू कंपाइलर कलेक्शन/नेक्स्ट/एप्पल इंक. कार्यान्वयन के अलावा, जिसने मूल स्टेपस्टोन कार्यान्वयन में कई एक्सटेंशन जोड़े, एक और फ्री और ओपन सोर्स सॉफ्टवेयर | फ्री, ओपन-सोर्स ऑब्जेक्टिव-सी कार्यान्वयन जिसे पोर्टेबल ऑब्जेक्ट कंपाइलर कहा जाता है, भी मौजूद है।<ref>{{cite web |url=http://users.pandora.be/stes/compiler.html |title=Portable Object Compiler |publisher=Users.pandora.be |date=January 1, 1970 |access-date=May 30, 2010 |archive-url=https://web.archive.org/web/20080802040731/http://users.pandora.be/stes/compiler.html |archive-date=August 2, 2008 |url-status=live }}</ref> पोर्टेबल ऑब्जेक्ट कंपाइलर द्वारा लागू किए गए एक्सटेंशन का सेट GCC/NeXT/Apple कार्यान्वयन से अलग है; विशेष रूप से, इसमें ऑब्जेक्टिव-सी के लिए स्मॉलटाक जैसे ब्लॉक शामिल हैं, जबकि इसमें प्रोटोकॉल और श्रेणियों की कमी है, ओपनस्टेप और इसके डेरिवेटिव और रिश्तेदार में बड़े पैमाने पर उपयोग की जाने वाली दो विशेषताएं। कुल मिलाकर, पीओसी भाषा के विकास में एक पुराने, पूर्व-नेक्स्ट चरण का प्रतिनिधित्व करता है, जो मोटे तौर पर ब्रैड कॉक्स की 1991 की किताब के अनुरूप है।


इसमें ऑब्जेक्टपैक नामक एक रनटाइम लाइब्रेरी भी शामिल है, जो कॉक्स की मूल ICPak101 लाइब्रेरी पर आधारित है (जो बदले में स्मॉलटाक -80 क्लास लाइब्रेरी से प्राप्त होती है), और ओपनस्टेप फाउंडेशनकिट से काफी अलग है।
[[माइक्रोसॉफ्ट]] कांटा {{tt|लीबॉबजेसी2}} 2015 में [[WinObjC|विंडोऑब्जेक्टसी]] के भागों में, [[यूनिवर्सल विंडोज प्लेटफॉर्म]] के लिए आईओएस ब्रिज। कोको टच और अंतर्निहित एपीआई के अपने स्वयं के कार्यान्वयन के साथ संयुक्त, परियोजना यूडब्ल्यूपी ऐप्स के अंदर आईओएस एप्लिकेशन कोड के पुन: उपयोग की अनुमति देती है।<ref>{{Cite web |url=https://github.com/Microsoft/WinObjC |title=WinObjC on GitHub |website=[[GitHub]] |access-date=February 13, 2018 |archive-url=https://web.archive.org/web/20171202223021/https://github.com/Microsoft/WinObjC/ |archive-date=December 2, 2017 |url-status=live }}</ref>


=== जीईओएस उद्देश्य-सी ===
विंडोज़ पर, उद्देश्य-सी विकास उपकरण जीएनयूस्टेप की वेबसाइट पर डाउनलोड करने के लिए प्रदान किए जाते हैं। जीएनयू स्टेप डेवलपमेंट प्रणाली में निम्नलिखित पैकेज होते हैं: जीएनयू स्टेप [[MinGW|मिनजीडब्ल्यू]] प्रणाली, जीएनयू स्टेप कोर, जीएनयू स्टेप डिवेल, जीएनयू स्टेप करियो, परियोजना केंद्र आईडीई (एक्सकोड की तरह, लेकिन उतना जटिल नहीं), गोर्म (इंटरफ़ेस बिल्डर लाइक एक्सकोड एनआईबी बिल्डर)। ये बाइनरी इंस्टॉलर 2016 से अपडेट नहीं किए गए हैं,<ref>{{Cite web |url=http://www.gnustep.org/windows/installer.html |title=GNUStep Installer |access-date=February 14, 2018 |archive-url=https://web.archive.org/web/20180217174757/http://www.gnustep.org/windows/installer.html |archive-date=February 17, 2018 |url-status=live }}</ref> इसलिए इसके अतिरिक्त [[Cygwin|साइगविन]] या [[MSYS2|एमएसवाईएस2]] के अनुसार निर्माण करके स्थापित करना अच्छा विचार हो सकता है।
[[GEOS (16-बिट ऑपरेटिंग सिस्टम)]] सिस्टम एक प्रोग्रामिंग भाषा का उपयोग करता है जिसे GEOS Objective-C या goc के रूप में जाना जाता है;<ref>{{cite web |url=http://www.breadbox.com/downloads.asp?id=54&category=GeosSDK&maincategory=SDK |title=Breadbox Computer Company LLC homepage |access-date=December 8, 2010 |archive-url=https://web.archive.org/web/20110727185136/http://www.breadbox.com/downloads.asp?id=54&category=GeosSDK&maincategory=SDK |archive-date=July 27, 2011 |url-status=dead }}</ref> नाम की समानता के बावजूद, दो भाषाएँ केवल समग्र अवधारणा में समान हैं और @ चिन्ह के साथ उपसर्ग वाले कीवर्ड का उपयोग करती हैं।
 
=== बजना ===
क्लैंग कंपाइलर सूट, एलएलवीएम प्रोजेक्ट का हिस्सा, ऑब्जेक्टिव-सी और अन्य भाषाओं को लागू करता है। GCC 4.3 (2008) के GPLv3 में बदलने के बाद, Apple ने क्लैंग के पक्ष में इसे छोड़ दिया, एक कंपाइलर जिसके पास संशोधित करने के लिए अधिक कानूनी शक्ति है। नतीजतन, आधुनिक ऑब्जेक्टिव-सी भाषा की कई विशेषताएं केवल क्लैंग द्वारा समर्थित हैं।
 
अपने क्लैंग-आधारित एलएलवीएम कंपाइलर के लिए ऐप्पल की वर्जनिंग स्कीम एलएलवीएम के ओपन-सोर्स वर्जनिंग से अलग है। देखना {{section link|Xcode|Toolchain versions}} एक अनुवाद के लिए<ref name="llvm-ver"/>
 
 
=== जीएनयू, जीएनयूस्टेप, और विनओबीजेसी ===
GNU प्रोजेक्ट, लंबे समय से, NeXT और Obj-C प्रोग्राम को पोर्ट करने के लिए एक प्लेटफॉर्म में रुचि रखता है। के लिए चेंजलॉग {{tt|libobjc}} जीसीसी में निर्देशिका से पता चलता है कि यह 1998 (जीसीसी 2.95) से पहले अस्तित्व में था, और इसके रीडमे ने 1993 (जीसीसी 2.4) में एक पुनर्लेखन पर आगे इशारा किया।<ref>{{cite web |title=gcc/libobjc |url=https://github.com/gcc-mirror/gcc/tree/master/libobjc |website=GitHub |publisher=gcc-mirror |access-date=6 January 2020 |date=6 January 2020 |quote=he runtime has been completely rewritten in gcc 2.4.  The earlier runtime had several severe bugs and was rather incomplete.}}</ref>
NeXT फ्रंटएंड सोर्स कोड जारी किया गया था क्योंकि इसे GCC के हिस्से के रूप में बनाया गया था, GNU पब्लिक लाइसेंस जारी किया गया था जो ऐसा करने के लिए व्युत्पन्न कार्यों को करने के लिए मजबूर करता है।{{when|date=January 2020}} Apple ने 4.2.1 तक GCC के अपने फोर्क को जारी करने में इस परंपरा को जारी रखा, जिसके बाद उन्होंने कंपाइलर को छोड़ दिया। जीसीसी अनुरक्षकों ने परिवर्तनों को स्वीकार किया, लेकिन ऑब्जेक्टिव-सी 2.0 भाषा जैसी नई सुविधाओं का समर्थन करने में ज्यादा निवेश नहीं किया।<ref name=objc2-faq/>{{rp|at=Which compiler}}
नई भाषा में रुचि रखने वाले जीएनयूस्टेप डेवलपर्स ने जीसीसी को फोर्क किया {{tt|libobjc}} जीसीसी से स्वतंत्र एक परियोजना के लिए कहा जाता है {{tt|libobjc2}} 2009 में। उन्होंने नई भाषा सिंटैक्स का लाभ उठाने के लिए क्लैंग के साथ रनटाइम के उपयोग की भी व्यवस्था की।<ref name=objc2-faq/>{{rp|at=Which compiler}} जीसीसी एक ही समय में धीरे-धीरे चला गया, लेकिन जीसीसी 4.6.0 (2011) में वे ऑब्जेक्टिव-सी 2.0 पर अपने libobjc में भी चले गए हैं।<ref name=gcc46/><ref>{{cite web |title=GNU Objective-C runtime API |url=https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gcc/GNU-Objective-C-runtime-API.html |website=Using GCC |access-date=6 January 2020}}</ref> जीएनयूस्टेप प्रलेखन सुझाव देता है कि जीसीसी कार्यान्वयन में अभी भी ब्लॉक, गैर-नाजुक चर और नए एआरसी के लिए समर्थन की कमी है।<ref name=objc2-faq/>{{rp|at=Which runtime}}
[[माइक्रोसॉफ्ट]] कांटा {{tt|libobjc2}} 2015 में [[WinObjC]] के एक हिस्से में, [[यूनिवर्सल विंडोज प्लेटफॉर्म]] के लिए आईओएस ब्रिज। कोको टच और अंतर्निहित एपीआई के अपने स्वयं के कार्यान्वयन के साथ संयुक्त, परियोजना यूडब्ल्यूपी ऐप्स के अंदर आईओएस एप्लिकेशन कोड के पुन: उपयोग की अनुमति देती है।<ref>{{Cite web |url=https://github.com/Microsoft/WinObjC |title=WinObjC on GitHub |website=[[GitHub]] |access-date=February 13, 2018 |archive-url=https://web.archive.org/web/20171202223021/https://github.com/Microsoft/WinObjC/ |archive-date=December 2, 2017 |url-status=live }}</ref>
विंडोज़ पर, उद्देश्य-सी विकास उपकरण जीएनयूस्टेप की वेबसाइट पर डाउनलोड करने के लिए प्रदान किए जाते हैं। GNUStep डेवलपमेंट सिस्टम में निम्नलिखित पैकेज होते हैं: GNUstep [[MinGW]] सिस्टम, GNUstep Core, GNUstep Devel, GNUstep Cairo, ProjectCenter IDE (Xcode की तरह, लेकिन उतना जटिल नहीं), Gorm (इंटरफ़ेस बिल्डर लाइक Xcode NIB बिल्डर)। ये बाइनरी इंस्टॉलर 2016 से अपडेट नहीं किए गए हैं,<ref>{{Cite web |url=http://www.gnustep.org/windows/installer.html |title=GNUStep Installer |access-date=February 14, 2018 |archive-url=https://web.archive.org/web/20180217174757/http://www.gnustep.org/windows/installer.html |archive-date=February 17, 2018 |url-status=live }}</ref> इसलिए इसके बजाय [[Cygwin]] या [[MSYS2]] के तहत निर्माण करके स्थापित करना एक बेहतर विचार हो सकता है।


== लाइब्रेरी का उपयोग ==
== लाइब्रेरी का उपयोग ==
ऑब्जेक्टिव-सी आज अक्सर मानक वस्तुओं (अक्सर किट या फ्रेमवर्क के रूप में जाना जाता है), जैसे कोको (एपीआई), जीएनयूस्टेप या [[ओबीजेएफडब्ल्यू]] की एक निश्चित लाइब्रेरी के साथ मिलकर प्रयोग किया जाता है। ये पुस्तकालय अक्सर ऑपरेटिंग सिस्टम के साथ आते हैं: जीएनयूस्टेप पुस्तकालय अक्सर [[लिनक्स]]-आधारित वितरण के साथ आते हैं और कोको मैकोज़ के साथ आता है। प्रोग्रामर को मौजूदा बेस क्लास (NSObject / OFObject) से कार्यक्षमता प्राप्त करने के लिए मजबूर नहीं किया जाता है। ऑब्जेक्टिव-सी नई रूट कक्षाओं की घोषणा के लिए अनुमति देता है जो किसी भी मौजूदा कार्यक्षमता को प्राप्त नहीं करते हैं। मूल रूप से, ऑब्जेक्टिव-सी-आधारित प्रोग्रामिंग वातावरण ने आमतौर पर ऑब्जेक्ट क्लास को बेस क्लास के रूप में पेश किया, जिससे लगभग सभी अन्य वर्ग विरासत में मिले। ओपनस्टेप की शुरूआत के साथ, नेक्स्ट ने एनएसओब्जेक्ट नामक एक नया बेस क्लास बनाया, जिसने ऑब्जेक्ट पर अतिरिक्त सुविधाओं की पेशकश की (उदाहरण के लिए कच्चे पॉइंटर्स के बजाय ऑब्जेक्ट रेफरेंस और रेफरेंस काउंटिंग का उपयोग करने पर जोर)। कोको में लगभग सभी वर्ग एनएसओब्जेक्ट से प्राप्त होते हैं।
ऑब्जेक्टिव-सी आज अधिकांशतः मानक वस्तुओं (अधिकांशतः किट या फ्रेमवर्क के रूप में जाना जाता है), जैसे कोको (एपीआई), जीएनयूस्टेप या [[ओबीजेएफडब्ल्यू]] की निश्चित लाइब्रेरी के साथ मिलकर प्रयोग किया जाता है। ये पुस्तकालय अधिकांशतः ऑपरेटिंग प्रणाली के साथ आते हैं: जीएनयूस्टेप पुस्तकालय अधिकांशतः [[लिनक्स]]-आधारित वितरण के साथ आते हैं और कोको मैकोज़ के साथ आता है। प्रोग्रामर को वर्त्तमान बेस क्लास (एनएसओब्जेक्ट ऑफऑब्जेक्ट) से कार्यक्षमता प्राप्त करने के लिए मजबूर नहीं किया जाता है। ऑब्जेक्टिव-सी नई रूट कक्षाओं की घोषणा के लिए अनुमति देता है जो किसी भी वर्त्तमान कार्यक्षमता को प्राप्त नहीं करते हैं। मूल रूप से, ऑब्जेक्टिव-सी-आधारित प्रोग्रामिंग वातावरण ने सामान्यतः ऑब्जेक्ट क्लास को बेस क्लास के रूप में प्रस्तुत किया, जिससे लगभग सभी अन्य वर्ग विरासत में मिले। ओपनस्टेप की प्रारंभ आत के साथ, नेक्स्ट ने एनएसओब्जेक्ट नामक नया बेस क्लास बनाया, जिसने ऑब्जेक्ट पर अतिरिक्त सुविधाओं की प्रस्तुतकश की (उदाहरण के लिए कच्चे पॉइंटर्स के अतिरिक्त ऑब्जेक्ट रेफरेंस और रेफरेंस काउंटिंग का उपयोग करने पर जोर)। कोको में लगभग सभी वर्ग एनएसओब्जेक्ट से प्राप्त होते हैं।


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


अभी हाल ही में, पैकेज प्रबंधक दिखाई देने लगे हैं, जैसे कि [[CocoaPods]], जिसका उद्देश्य पैकेज प्रबंधक और पैकेजों का भंडार दोनों बनना है। बहुत सारे ओपन-सोर्स ऑब्जेक्टिव-सी कोड जो पिछले कुछ वर्षों में लिखे गए थे, अब CocoaPods का उपयोग करके इंस्टॉल किए जा सकते हैं।
अभी हाल ही में, पैकेज प्रबंधक दिखाई देने लगे हैं, जैसे कि [[CocoaPods|कोकोपोड्स]], जिसका उद्देश्य पैकेज प्रबंधक और पैकेजों का भंडार दोनों बनना है। बहुत सारे ओपन-सोर्स ऑब्जेक्टिव-सी कोड जो पिछले कुछ वर्षों में लिखे गए थे, अब कोकोपोड्स का उपयोग करके इंस्टॉल किए जा सकते हैं।


== भाषा का विश्लेषण ==
== भाषा का विश्लेषण ==
{{more citations needed section|date=December 2011}}
उद्देश्य-सी कार्यान्वयन सी में लिखे गए पतले रन टाइम प्रणाली का उपयोग करते हैं, जो एप्लिकेशन के आकार में बहुत कम जोड़ता है। इसके विपरीत, अधिकांश ऑब्जेक्ट-ओरिएंटेड प्रणाली जब इसे बनाया गया था तब बड़े [[आभासी मशीन]] रनटाइम का उपयोग किया गया था। ऑब्जेक्टिव-सी में लिखे गए प्रोग्राम उनके कोड के आकार और पुस्तकालयों के आकार से बहुत बड़े नहीं होते हैं (जिन्हें सामान्यतः पर सॉफ़्टवेयर वितरण में सम्मिलित करने की आवश्यकता नहीं होती है), स्मॉलटाक प्रणाली के विपरीत जहां बड़ी मात्रा में मेमोरी होती थी केवल विंडो खोलने के लिए उपयोग किया जाता है। ऑब्जेक्टिव-सी एप्लिकेशन समान सी या सी ++ एप्लिकेशन से बड़े होते हैं क्योंकि ऑब्जेक्टिव-सी डायनेमिक टाइपिंग विधियों को अलग या इनलाइन करने की अनुमति नहीं देता है। चूंकि प्रोग्रामर के पास प्रत्यायोजित करने, कॉल को आगे बढ़ाने, फ्लाई पर चयनकर्ताओं का निर्माण करने और उन्हें रनटाइम प्रणाली में पास करने की ऐसी स्वतंत्रता है, इसलिए ऑब्जेक्टिव-सी कंपाइलर यह नहीं मान सकता है कि अप्रयुक्त विधियों को हटाना या इनलाइन कॉल को सुरक्षित करना है।
उद्देश्य-सी कार्यान्वयन सी में लिखे गए पतले रन टाइम सिस्टम का उपयोग करते हैं{{Citation needed|reason=The latest version of [https://github.com/opensource-apple/objc4 objc4] claims to be mostly objc and C++|date=December 2018}}, जो एप्लिकेशन के आकार में बहुत कम जोड़ता है। इसके विपरीत, अधिकांश ऑब्जेक्ट-ओरिएंटेड सिस्टम जब इसे बनाया गया था तब बड़े [[आभासी मशीन]] रनटाइम का उपयोग किया गया था। ऑब्जेक्टिव-सी में लिखे गए प्रोग्राम उनके कोड के आकार और पुस्तकालयों के आकार से बहुत बड़े नहीं होते हैं (जिन्हें आम तौर पर सॉफ़्टवेयर वितरण में शामिल करने की आवश्यकता नहीं होती है), स्मॉलटाक सिस्टम के विपरीत जहां बड़ी मात्रा में मेमोरी होती थी केवल एक विंडो खोलने के लिए उपयोग किया जाता है। ऑब्जेक्टिव-सी एप्लिकेशन समान सी या सी ++ एप्लिकेशन से बड़े होते हैं क्योंकि ऑब्जेक्टिव-सी डायनेमिक टाइपिंग तरीकों को अलग या इनलाइन करने की अनुमति नहीं देता है। चूंकि प्रोग्रामर के पास प्रत्यायोजित करने, कॉल को आगे बढ़ाने, फ्लाई पर चयनकर्ताओं का निर्माण करने और उन्हें रनटाइम सिस्टम में पास करने की ऐसी स्वतंत्रता है, इसलिए ऑब्जेक्टिव-सी कंपाइलर यह नहीं मान सकता है कि अप्रयुक्त तरीकों को हटाना या इनलाइन कॉल को सुरक्षित करना है।


इसी तरह, भाषा को मौजूदा सी कंपाइलर्स (जीएनयू कंपाइलर संग्रह में, पहले प्रीप्रोसेसर के रूप में, फिर मॉड्यूल के रूप में) के बजाय एक नए कंपाइलर के रूप में लागू किया जा सकता है। यह ऑब्जेक्टिव-सी को सी कोड, लाइब्रेरी, टूल्स आदि के विशाल मौजूदा संग्रह का लाभ उठाने की अनुमति देता है। मौजूदा सी लाइब्रेरी को ओओ-स्टाइल इंटरफ़ेस प्रदान करने के लिए ऑब्जेक्टिव-सी [[एडेप्टर पैटर्न]] में लपेटा जा सकता है। इस पहलू में, यह [[GObject]] लाइब्रेरी और वाला (प्रोग्रामिंग भाषा) भाषा के समान है, जो [[जीटीके]] अनुप्रयोगों के विकास में व्यापक रूप से उपयोग की जाती हैं।
इसी तरह, भाषा को वर्त्तमान सी कंपाइलर्स (जीएनयू कंपाइलर संग्रह में, पहले प्रीप्रोसेसर के रूप में, फिर मॉड्यूल के रूप में) के अतिरिक्त नए कंपाइलर के रूप में प्रयुक्त किया जा सकता है। यह ऑब्जेक्टिव-सी को सी कोड, लाइब्रेरी, उपकरण्स आदि के विशाल वर्त्तमान संग्रह का लाभ उठाने की अनुमति देता है। वर्त्तमान सी लाइब्रेरी को ओओ-स्टाइल इंटरफ़ेस प्रदान करने के लिए ऑब्जेक्टिव-सी [[एडेप्टर पैटर्न]] में लपेटा जा सकता है। इस पहलू में, यह [[GObject|गोऑब्जेक्ट]] लाइब्रेरी और वाला (प्रोग्रामिंग भाषा) भाषा के समान है, जो [[जीटीके]] अनुप्रयोगों के विकास में व्यापक रूप से उपयोग की जाती हैं।


इन सभी व्यावहारिक परिवर्तनों ने प्रवेश की बाधाओं को कम कर दिया, संभवतः 1980 के दशक में स्मॉलटाक की व्यापक स्वीकृति के लिए सबसे बड़ी समस्या।
इन सभी व्यावहारिक परिवर्तनों ने प्रवेश की बाधाओं को कम कर दिया, संभवतः 1980 के दशक में स्मॉलटाक की व्यापक स्वीकृति के लिए सबसे बड़ी समस्या।


एक आम आलोचना यह है कि ऑब्जेक्टिव-सी में नाम स्थान के लिए भाषा समर्थन नहीं है। इसके बजाय, प्रोग्रामर को अपने वर्ग के नामों में उपसर्ग जोड़ने के लिए मजबूर किया जाता है, जो परंपरागत रूप से नाम स्थान के नाम से कम होते हैं और इस प्रकार टकराव के लिए अधिक प्रवण होते हैं। 2007 तक, [[कोको (सॉफ्टवेयर)]] प्रोग्रामिंग वातावरण में सभी macOS कक्षाएं और फ़ंक्शन NS (जैसे NSObject, NSButton) के साथ प्रीफ़िक्स्ड हैं ताकि उन्हें macOS या iOS कोर से संबंधित के रूप में पहचाना जा सके; NS, NeXTSTEP के विकास के दौरान परिभाषित किए गए वर्गों के नामों से निकला है।
सामान्य आलोचना यह है कि ऑब्जेक्टिव-सी में नाम स्थान के लिए भाषा समर्थन नहीं है। इसके अतिरिक्त, प्रोग्रामर को अपने वर्ग के नामों में उपसर्ग जोड़ने के लिए मजबूर किया जाता है, जो परंपरागत रूप से नाम स्थान के नाम से कम होते हैं और इस प्रकार टकराव के लिए अधिक प्रवण होते हैं। 2007 तक, [[कोको (सॉफ्टवेयर)]] प्रोग्रामिंग वातावरण में सभी मैक ओएस कक्षाएं और फलन एन एस (जैसे एनएसओब्जेक्ट, एनएसबटन) के साथ प्रीफ़िक्स्ड हैं ताकि उन्हें मैक ओएस या आईओएस कोर से संबंधित के रूप में पहचाना जा सके; एन एस, नेक्स्टस्टेप के विकास के समय परिभाषित किए गए वर्गों के नामों से निकला है।


चूँकि Objective-C, C का एक सख्त सुपरसेट है, यह C आदिम प्रकारों को [[प्रथम श्रेणी की वस्तु]]ओं के रूप में नहीं मानता है।
चूँकि उद्देश्य सी, सी का सख्त सुपरसेट है, यह सी आदिम प्रकारों को [[प्रथम श्रेणी की वस्तु]]ओं के रूप में नहीं मानता है।


सी ++ के विपरीत, ऑब्जेक्टिव-सी [[ऑपरेटर ओवरलोडिंग]] का समर्थन नहीं करता है। सी ++ के विपरीत, ऑब्जेक्टिव-सी किसी ऑब्जेक्ट को सीधे केवल एक वर्ग से प्राप्त करने की अनुमति देता है (एकाधिक विरासत को रोकता है)। हालांकि, ज्यादातर मामलों में, समान परिणाम प्राप्त करने के वैकल्पिक तरीकों के रूप में श्रेणियों और प्रोटोकॉल का उपयोग किया जा सकता है।
सी ++ के विपरीत, ऑब्जेक्टिव-सी [[ऑपरेटर ओवरलोडिंग]] का समर्थन नहीं करता है। सी ++ के विपरीत, ऑब्जेक्टिव-सी किसी ऑब्जेक्ट को सीधे केवल वर्ग से प्राप्त करने की अनुमति देता है (एकाधिक विरासत को रोकता है)। चुकी, अधिकांशतः स्थितियों में, समान परिणाम प्राप्त करने के वैकल्पिक विधियों के रूप में श्रेणियों और प्रोटोकॉल का उपयोग किया जा सकता है।


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


=== स्मृति प्रबंधन ===
=== स्मृति प्रबंधन ===
ऑब्जेक्टिव-सी के पहले संस्करण कचरा संग्रह (कंप्यूटर विज्ञान) का समर्थन नहीं करते थे। उस समय यह निर्णय कुछ बहस का विषय था, और कई लोगों ने पूरे सिस्टम को अनुपयोगी बनाने के लिए लॉन्ग डेड टाइम (जब स्मॉलटाक ने संग्रह का प्रदर्शन किया) माना। कुछ तीसरे पक्ष के कार्यान्वयन ने इस सुविधा को जोड़ा है (सबसे विशेष रूप से Boehm कचरा संग्राहक का उपयोग करके GNUstep), और Apple ने इसे Mac OS X v10.5 के रूप में लागू किया है।<ref>{{cite web |url=https://www.apple.com/macosx/developertools/xcode.html |title=Mac OS X Leopard – Xcode 3.0 |author=Apple, Inc. |date=August 22, 2006 |publisher=apple.com |access-date=August 22, 2006 |url-status=dead |archive-url=https://web.archive.org/web/20071024144921/http://www.apple.com/macosx/developertools/xcode.html |archive-date=October 24, 2007 }}</ref> हालाँकि, macOS और iOS के अधिक हाल के संस्करणों में, कचरा संग्रह को 2011 में शुरू की गई स्वचालित संदर्भ गणना (ARC) के पक्ष में बहिष्कृत कर दिया गया है।
ऑब्जेक्टिव-सी के पहले संस्करण कचरा संग्रह (कंप्यूटर विज्ञान) का समर्थन नहीं करते थे। उस समय यह निर्णय कुछ बहस का विषय था, और कई लोगों ने पूरे प्रणाली को अनुपयोगी बनाने के लिए लंबे डेड टाइम (जब स्मॉलटाक ने संग्रह का प्रदर्शन किया) माना। कुछ तीसरे पक्ष के कार्यान्वयन ने इस सुविधा को जोड़ा है (सबसे विशेष रूप से बोहम कचरा संग्राहक का उपयोग करके जीएनयूस्टेप), और एप्पल ने इसे मैक ओएस एक्स वी10.5 के रूप में प्रयुक्त किया है।<ref>{{cite web |url=https://www.apple.com/macosx/developertools/xcode.html |title=Mac OS X Leopard – Xcode 3.0 |author=Apple, Inc. |date=August 22, 2006 |publisher=apple.com |access-date=August 22, 2006 |url-status=dead |archive-url=https://web.archive.org/web/20071024144921/http://www.apple.com/macosx/developertools/xcode.html |archive-date=October 24, 2007 }}</ref> चुकीं, मैक ओएस और आईओएस के अधिक हाल के संस्करणों में, कचरा संग्रह को 2011 में प्रारंभ की गई स्वचालित संदर्भ गणना (एआरसी) के पक्ष में बहिष्कृत कर दिया गया है।


एआरसी के साथ, कंपाइलर आवेषण स्टेटिक प्रोग्राम विश्लेषण के आधार पर स्वचालित रूप से ऑब्जेक्टिव-सी कोड में कॉल को बनाए रखता है और जारी करता है। स्वचालन प्रोग्रामर को स्मृति प्रबंधन कोड में लिखने से राहत देता है। एआरसी ऑब्जेक्टिव-सी भाषा में कमजोर संदर्भ भी जोड़ता है।<ref>{{cite web |url=https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |title=Transitioning to ARC Release Notes |work=iOS Developer Library |publisher=Developer.apple.com |access-date=April 16, 2014 |archive-url=https://web.archive.org/web/20110907013839/http://developer.apple.com/library/iOS/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |archive-date=September 7, 2011 |url-status=live }}</ref>
एआरसी के साथ, कंपाइलर आवेषण स्टेटिक प्रोग्राम विश्लेषण के आधार पर स्वचालित रूप से ऑब्जेक्टिव-सी कोड में कॉल को बनाए रखता है और जारी करता है। स्वचालन प्रोग्रामर को स्मृति प्रबंधन कोड में लिखने से राहत देता है। एआरसी ऑब्जेक्टिव-सी भाषा में कमजोर संदर्भ भी जोड़ता है।<ref>{{cite web |url=https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |title=Transitioning to ARC Release Notes |work=iOS Developer Library |publisher=Developer.apple.com |access-date=April 16, 2014 |archive-url=https://web.archive.org/web/20110907013839/http://developer.apple.com/library/iOS/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html |archive-date=September 7, 2011 |url-status=live }}</ref>




===ऑब्जेक्टिव-सी और सी++=== के बीच दार्शनिक अंतर
 
=== ऑब्जेक्टिव-सी और सी++ के बीच दार्शनिक अंतर ===
सी ++ और ऑब्जेक्टिव-सी का डिज़ाइन और कार्यान्वयन सी को विस्तारित करने के लिए मौलिक रूप से अलग-अलग दृष्टिकोणों का प्रतिनिधित्व करता है।
सी ++ और ऑब्जेक्टिव-सी का डिज़ाइन और कार्यान्वयन सी को विस्तारित करने के लिए मौलिक रूप से अलग-अलग दृष्टिकोणों का प्रतिनिधित्व करता है।


सी की प्रक्रियात्मक प्रोग्रामिंग की शैली के अलावा, सी ++ सीधे वस्तु-उन्मुख प्रोग्रामिंग, [[सामान्य प्रोग्रामिंग]] और [[मेटाप्रोग्रामिंग]] के कुछ रूपों का समर्थन करता है। सी++ भी सी++ मानक पुस्तकालय के साथ आता है जिसमें अनुक्रम कंटेनर (सी++) शामिल है। इसी तरह, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, डायनामिक टाइपिंग और [[प्रतिबिंब (कंप्यूटर विज्ञान)]] में ऑब्जेक्टिव-सी जोड़ता है। इसका उपयोग [[OpenStep]] जैसी लाइब्रेरी जैसे कि OPENSTEP, Cocoa (API), या GNUstep के साथ किया जाता है, जो C++ के मानक लाइब्रेरी के समान कार्यक्षमता प्रदान करता है।
सी की प्रक्रियात्मक प्रोग्रामिंग की शैली के अतिरिक्त, सी ++ सीधे वस्तु-उन्मुख प्रोग्रामिंग, [[सामान्य प्रोग्रामिंग]] और [[मेटाप्रोग्रामिंग]] के कुछ रूपों का समर्थन करता है। सी++ भी सी++ मानक पुस्तकालय के साथ आता है जिसमें अनुक्रम कंटेनर (सी++) सम्मिलित है। इसी तरह, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, डायनामिक टाइपिंग और [[प्रतिबिंब (कंप्यूटर विज्ञान)]] में ऑब्जेक्टिव-सी जोड़ता है। इसका उपयोग [[OpenStep|ओपनस्टेप]] जैसी लाइब्रेरी जैसे कि ओपनस्टेप, कोको (एपीआई), या जीएनयू स्टेप के साथ किया जाता है, जो सी++ के मानक लाइब्रेरी के समान कार्यक्षमता प्रदान करता है।


एक उल्लेखनीय अंतर यह है कि ऑब्जेक्टिव-सी रिफ्लेक्शन (कंप्यूटर साइंस) सुविधाओं के लिए रनटाइम सपोर्ट प्रदान करता है, जबकि सी ++ सी में केवल थोड़ी मात्रा में रनटाइम सपोर्ट जोड़ता है। ऑब्जेक्टिव-सी में, किसी ऑब्जेक्ट को अपने स्वयं के गुणों के बारे में पूछा जा सकता है, जैसे, यह एक निश्चित संदेश का जवाब देगा। सी ++ में, बाहरी पुस्तकालयों के उपयोग के बिना यह संभव नहीं है।
उल्लेखनीय अंतर यह है कि ऑब्जेक्टिव-सी रिफ्लेक्शन (कंप्यूटर साइंस) सुविधाओं के लिए रनटाइम सहायता प्रदान करता है, जबकि सी ++ सी में केवल थोड़ी मात्रा में रनटाइम सपोर्ट जोड़ता है। ऑब्जेक्टिव-सी में, किसी ऑब्जेक्ट को अपने स्वयं के गुणों के बारे में पूछा जा सकता है, जैसे, यह निश्चित संदेश का उत्तर देगा। सी ++ में, बाहरी पुस्तकालयों के उपयोग के बिना यह संभव नहीं है।


प्रतिबिंब का उपयोग एक भाषा की गतिशील (रन-टाइम) सुविधाओं और स्थिर (संकलन-समय) सुविधाओं के बीच व्यापक अंतर का हिस्सा है। हालांकि ऑब्जेक्टिव-सी और सी ++ प्रत्येक दोनों सुविधाओं के मिश्रण को नियोजित करते हैं, ऑब्जेक्टिव-सी निश्चित रूप से रन-टाइम निर्णयों के लिए तैयार है जबकि सी ++ संकलन-समय के निर्णयों के लिए तैयार है। डायनेमिक और स्टैटिक प्रोग्रामिंग के बीच तनाव में प्रोग्रामिंग में कई क्लासिक ट्रेड-ऑफ शामिल हैं: डायनेमिक फीचर्स में लचीलापन आता है, स्टैटिक फीचर्स में गति और टाइप चेकिंग शामिल होती है।
प्रतिबिंब का उपयोग भाषा की गतिशील (रन-टाइम) सुविधाओं और स्थिर (संकलन-समय) सुविधाओं के बीच व्यापक अंतर का भाग है। चुकी ऑब्जेक्टिव-सी और सी ++ प्रत्येक दोनों सुविधाओं के मिश्रण को नियोजित करते हैं, ऑब्जेक्टिव-सी निश्चित रूप से रन-टाइम निर्णयों के लिए तैयार है जबकि सी ++ संकलन-समय के निर्णयों के लिए तैयार है। डायनेमिक और स्टैटिक प्रोग्रामिंग के बीच तनाव में प्रोग्रामिंग में कई क्लासिक ट्रेड-ऑफ सम्मिलित हैं: डायनेमिक विशेषता्स में लचीलापन आता है, स्टैटिक विशेषता्स में गति और टाइप चेकिंग सम्मिलित होती है।


[[रनटाइम बहुरूपता]] का उपयोग करके दोनों भाषाओं में सामान्य प्रोग्रामिंग और मेटाप्रोग्रामिंग को लागू किया जा सकता है। सी ++ में यह आभासी कार्यों और [[रनटाइम प्रकार की पहचान]] का रूप लेता है, जबकि ऑब्जेक्टिव-सी गतिशील टाइपिंग और प्रतिबिंब प्रदान करता है। उद्देश्य-सी और सी ++ दोनों संकलन-समय बहुरूपता (सामान्य कार्यों) का समर्थन करते हैं, उद्देश्य-सी केवल 2015 में इस सुविधा को जोड़ रहा है।
[[रनटाइम बहुरूपता]] का उपयोग करके दोनों भाषाओं में सामान्य प्रोग्रामिंग और मेटाप्रोग्रामिंग को प्रयुक्त किया जा सकता है। सी ++ में यह आभासी कार्यों और [[रनटाइम प्रकार की पहचान]] का रूप लेता है, जबकि ऑब्जेक्टिव-सी गतिशील टाइपिंग और प्रतिबिंब प्रदान करता है। उद्देश्य-सी और सी ++ दोनों संकलन-समय बहुरूपता (सामान्य कार्यों) का समर्थन करते हैं, उद्देश्य-सी केवल 2015 में इस सुविधा को जोड़ रहा है।


== यह भी देखें ==
== यह भी देखें ==
Line 1,023: Line 945:
* सी ++
* सी ++
* [[प्रोग्रामिंग भाषाओं की तुलना]]
* [[प्रोग्रामिंग भाषाओं की तुलना]]
* IBM सिस्टम ऑब्जेक्ट मॉडल# संकलित क्लास लाइब्रेरी के लिए समर्थन की तुलना|COM, GObject, SOM, Windows रनटाइम, XPCOM के साथ तुलना
* IBM प्रणाली ऑब्जेक्ट मॉडल# संकलित क्लास लाइब्रेरी के लिए समर्थन की तुलना|सीOM, GObject, SOM, Windows रनटाइम, XPसीOM के साथ तुलना
* स्विफ्ट (प्रोग्रामिंग भाषा)
* स्विफ्ट (प्रोग्रामिंग भाषा)
* एक्सकोड
* एक्सकोड
* WinObjC (उर्फ: आईओएस के लिए विंडोज ब्रिज)
* WinObjसी (उर्फ: आईओएस के लिए विंडोज ब्रिज)


==संदर्भ==
==संदर्भ==
{{Reflist}}
{{Reflist}}


==अग्रिम पठन==
==अग्रिम पठन==
Line 1,036: Line 957:
* {{cite book |first=Brad J. |last=Cox |title=Object Oriented Programming: An Evolutionary Approach |publisher=Addison Wesley |year=1991 |isbn=0-201-54834-8}}
* {{cite book |first=Brad J. |last=Cox |title=Object Oriented Programming: An Evolutionary Approach |publisher=Addison Wesley |year=1991 |isbn=0-201-54834-8}}
{{Refend}}
{{Refend}}


==बाहरी संबंध==
==बाहरी संबंध==
{{Wikibooks|Objective-C Programming}}
* [https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ Programming with उद्देश्य सी], from एप्पल (2012-12-13)
* [https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ Programming with Objective-C], from Apple (2012-12-13)
* ''[https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html The उद्देश्य सी Programming Language]'', from एप्पल (2011-10-11)
* ''[https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html The Objective-C Programming Language]'', from Apple (2011-10-11)
* ''[https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html उद्देश्य सी Runtime Programming Guide]'', from एप्पल (2009-10-19)
* ''[https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html Objective-C Runtime Programming Guide]'', from Apple (2009-10-19)
* [https://www.gnu.org/software/gnustep/resources/documentation/Developer/Base/ProgrammingManual/manual_toc.html उद्देश्य सी जीएनयू step Base Programming Manual]
* [https://www.gnu.org/software/gnustep/resources/documentation/Developer/Base/ProgrammingManual/manual_toc.html Objective-C GNUstep Base Programming Manual]
* [https://web.archive.org/web/20120204044211/http://virtualschool.edu/objectivec/ उद्देश्य सी by Brad सीox]
* [https://web.archive.org/web/20120204044211/http://virtualschool.edu/objectivec/ Objective-C by Brad Cox]
* [http://www.faqs.org/faqs/computer-lang/Objective-C/faq/ उद्देश्य सी FAQ]
* [http://www.faqs.org/faqs/computer-lang/Objective-C/faq/ Objective-C FAQ]
 
{{Programming languages}}
{{CProLang}}


{{Authority control}}
{{Authority control}}


{{DEFAULTSORT:Objective-C}}[[Category: उद्देश्य-सी | उद्देश्य-सी ]] [[Category: सी प्रोग्रामिंग भाषा परिवार]] [[Category: कक्षा-आधारित प्रोग्रामिंग भाषाएँ]] [[Category: गतिशील रूप से टाइप की गई प्रोग्रामिंग भाषाएँ]] [[Category: जीएनयूस्टेप]] [[Category: अगला]] [[Category: वस्तु-उन्मुख प्रोग्रामिंग भाषाएँ]] [[Category: 1986 में बनाई गई प्रोग्रामिंग लैंग्वेज]]
{{DEFAULTSORT:Objective-C}}
 
 


[[Category: Machine Translated Page]]
[[Category:1986 में बनाई गई प्रोग्रामिंग लैंग्वेज|Objective-C]]
[[Category:Created On 17/02/2023]]
[[Category:Articles with hatnote templates targeting a nonexistent page|Objective-C]]
[[Category:Citation Style 1 templates|M]]
[[Category:Collapse templates|Objective-C]]
[[Category:Created On 17/02/2023|Objective-C]]
[[Category:Lua-based templates|Objective-C]]
[[Category:Machine Translated Page|Objective-C]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Objective-C]]
[[Category:Pages with script errors|Objective-C]]
[[Category:Pages with syntax highlighting errors]]
[[Category:Short description with empty Wikidata description|Objective-C]]
[[Category:Sidebars with styles needing conversion|Objective-C]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Objective-C]]
[[Category:Templates based on the Citation/CS1 Lua module]]
[[Category:Templates generating COinS|Cite magazine]]
[[Category:Templates generating microformats|Objective-C]]
[[Category:Templates that add a tracking category|Objective-C]]
[[Category:Templates that are not mobile friendly|Objective-C]]
[[Category:Templates that generate short descriptions|Objective-C]]
[[Category:Templates using TemplateData|Objective-C]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia fully protected templates|Cite magazine]]
[[Category:Wikipedia metatemplates|Objective-C]]
[[Category:अगला|Objective-C]]
[[Category:उद्देश्य-सी| उद्देश्य-सी ]]
[[Category:कक्षा-आधारित प्रोग्रामिंग भाषाएँ|Objective-C]]
[[Category:गतिशील रूप से टाइप की गई प्रोग्रामिंग भाषाएँ|Objective-C]]
[[Category:जीएनयूस्टेप|Objective-C]]
[[Category:वस्तु-उन्मुख प्रोग्रामिंग भाषाएँ|Objective-C]]
[[Category:सी प्रोग्रामिंग भाषा परिवार|Objective-C]]

Latest revision as of 16:44, 2 November 2023

Objective-C
परिवारC
द्वारा डिज़ाइन किया गयाTom Love and Brad Cox
पहली प्रस्तुति1984; 40 years ago (1984)
Stable release
2.0[1]
टाइपिंग अनुशासनStatic, dynamic, weak
ओएसCross-platform
फ़ाइल नाम एक्सटेंशनएस.h, .m, .mm, .M
वेबसाइटdeveloper.apple.com
Major implementations
Clang, GCC
Influenced by
C, Smalltalk
Influenced
Groovy, Java, Nu, Objective-J, TOM, Swift[2]

ऑब्जेक्टिव-सी सामान्य प्रयोजन प्रोग्रामिंग भाषा है। सामान्य-उद्देश्य, ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंगभाषा है जो सी (प्रोग्रामिंग भाषा) में स्मॉलटॉक-स्टाइल संदेश देना करती है।[3] प्रोग्रामिंग भाषा। मूल रूप से 1980 के दशक की प्रारंभ में ब्रैड कॉक्स और टॉम लव द्वारा विकसित किया गया था, इसे नेक्स्ट द्वारा अपने नेक्स्ट स्टेप ऑपरेटिंग प्रणाली के लिए चुना गया था। एप्पल आई एन सी. मैक ओएस की नेक्स्ट स्टेप से सीधी वंशावली के कारण,[4] ऑब्जेक्टिव-सी, स्विफ्ट (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा की प्रारंभ तक मैक ओएस और आईओएस एप्लिकेशन (उनके संबंधित एप्लिकेशन प्रोग्रामिंग अंतरफलक, कोको (एपीआई) और कोको टच के माध्यम से) विकसित करने के लिए एप्पल द्वारा उपयोग की जाने वाली, समर्थित और प्रचारित मानक प्रोग्रामिंग भाषा थी।[3]

2014 में गैर-एप्पल ऑपरेटिंग प्रणाली के लिए विकसित ऑब्जेक्टिव-सी प्रोग्राम या जो ऐप्पल के एपीआई पर निर्भर नहीं हैं, उन्हें जीएनयू जीएनयू संकलक संग्रह या एलएलवीएम क्लैंग द्वारा समर्थित किसी भी कंप्यूटर मंच के लिए भी संकलित किया जा सकता है।

उद्देश्य-सी स्रोत कोड 'मैसेजिंग कार्यान्वयन' प्रोग्राम फ़ाइलें सामान्यतः होती हैं .एम फ़ाइल नाम एक्सटेंशन है, जबकि ऑब्जेक्टिव-सी 'हेडर इंटरफ़ेस' फ़ाइलें हैं .एच एक्सटेंशन, सी हेडर फाइलों के समान है। ऑब्जेक्टिव- .एम एम फाइल एक्सटेंशन और सी++ फाइलों को ए से निरूपित किया जाता है।

इतिहास

ऑब्जेक्टिव-सी मुख्य रूप से ब्रैड कॉक्स और टॉम लव द्वारा 1980 के दशक की प्रारंभ में उनकी कंपनी कदम पत्थर | प्रोडक्टिविटी प्रोडक्ट्स इंटरनेशनल (पीपीआई) में बनाया गया था।[5]

अपनी कंपनी के निर्माण के लिए अग्रणी, दोनों को 1981 में आई.टी.टी कॉर्पोरेशन के प्रोग्रामिंग टेक्नोलॉजी सेंटर में रहते हुए स्मॉलटाक से परिचित कराया गया था। ऑब्जेक्टिव-सी पर सबसे पहला काम उसी समय के आसपास का है।[6] सॉफ्टवेयर इंजीनियरिंग और प्रोग्रामिंग में वास्तविक पुन: प्रयोज्यता की समस्याओं से कॉक्स को परेशान किया गया था। उन्होंने अनुभव किया कि आईटीटी में प्रणाली डेवलपर्स के लिए विकास के वातावरण के निर्माण में स्मॉलटाक जैसी भाषा अमूल्य होगी। चुकी, उन्होंने और टॉम लव ने यह भी माना कि आईटीटी के टेलीकॉम इंजीनियरिंग परिवेश में सी के साथ पश्चगामी संगतता गंभीर रूप से महत्वपूर्ण थी।[7]

कॉक्स ने स्मॉलटाक की कुछ क्षमताओं को जोड़ने के लिए सी (प्रोग्रामिंग भाषा) के लिए प्री-प्रोसेसर लिखना प्रारंभ किया। जल्द ही उनके पास सी (प्रोग्रामिंग भाषा) भाषा के लिए ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन का कार्य कार्यान्वयन था, जिसे उन्होंने ऑब्जेक्ट-ओरिएंटेड प्री-कंपाइलर के लिए ओओपीसी कहा।[8]

लव को 1982 में श्लम्बरगर रिसर्च द्वारा काम पर रखा गया था और उन्हें स्मॉलटाक -80 की पहली व्यावसायिक प्रति प्राप्त करने का अवसर मिला, जिसने उनके दिमाग की उपज के विकास को और प्रभावित किया। यह प्रदर्शित करने के लिए कि वास्तविक प्रगति की जा सकती है, कॉक्स ने दिखाया कि विनिमेय सॉफ़्टवेयर घटकों को वास्तव में वर्त्तमान उपकरणों में केवल कुछ व्यावहारिक परिवर्तनों की आवश्यकता है। विशेष रूप से, उन्हें लचीले विधियों से वस्तुओं का समर्थन करने की आवश्यकता होती है, पुस्तकालयों के उपयोग योग्य सेट के साथ आपूर्ति की जाती है, और कोड (और कोड द्वारा आवश्यक किसी भी संसाधन) को क्रॉस-प्लेटफ़ॉर्म प्रारूप में बंडल करने की अनुमति देता है।

लव एंड कॉक्स ने अंततः अपने उत्पाद का व्यावसायीकरण करने के लिए पीपीआई का गठन किया, जिसमें ऑब्जेक्टिव-सी कंपाइलर को क्लास लाइब्रेरी के साथ जोड़ा गया। 1986 में, कॉक्स ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, विकासवादी दृष्टिकोण पुस्तक में ऑब्जेक्टिव-सी का मुख्य विवरण अपने मूल रूप में प्रकाशित किया। यद्यपि वह यह इंगित करने के लिए सावधान था कि उद्देश्य-सी प्रदान करने की तुलना में पुन: प्रयोज्यता की समस्या के लिए और भी कुछ है, भाषा अधिकांशतः अन्य भाषाओं के साथ विशेषता के लिए विशेषता की तुलना करती है।

नेक्स्ट के माध्यम से लोकप्रियता

1988 में, नेक्स्ट ने स्टेपस्टोन (पीपीआई का नया नाम, ऑब्जेक्टिव-सी ट्रेडमार्क का स्वामी) से ऑब्जेक्टिव-सी लाइसेंस प्राप्त किया और ऑब्जेक्टिव-सी का समर्थन करने के लिए जीएनयू कंपाइलर कलेक्शन कंपाइलर का विस्तार किया। नेक्स्ट ने आवेदन किट और फाउंडेशन किट लाइब्रेरी विकसित की, जिस पर नेक्स्टस्टेप यूजर इंटरफेस और इंटरफेस बिल्डर आधारित थे। जबकि नेक्स्ट वर्कस्टेशन बाज़ार में बड़ा प्रभाव बनाने में विफल रहे, उद्योग में उपकरणों की व्यापक रूप से सराहना की गई। इसने नेक्स्ट को हार्डवेयर उत्पादन को छोड़ने और सॉफ्टवेयर उपकरण्स पर ध्यान केंद्रित करने, कस्टम प्रोग्रामिंग के लिए मंच के रूप में नेक्स्टस्टेप (और ओपनस्टेप) को बेचने का नेतृत्व किया।

जीपीएल की नियमो को किनारे करने के लिए, नेक्स्ट मूल रूप से ऑब्जेक्टिव-सी फ्रंटएंड को अलग से शिप करने का प्रयोजन रखता था, जिससे उपयोगकर्ता इसे जीसीसी के साथ लिंक करके कंपाइलर निष्पादन योग्य बना सके। चुकी प्रारंभ में रिचर्ड एम. स्टॉलमैन द्वारा स्वीकार किया गया था, स्टॉलमैन द्वारा जीएनयू के वकीलों के साथ परामर्श करने के बाद इस योजना को अस्वीकार कर दिया गया था और नेक्स्ट ने ऑब्जेक्टिव-सी को जीसीसी का भाग बनाने पर सहमति व्यक्त की थी।[9]

जीएनयू कंपाइलर संग्रह का विस्तार करने का काम स्टीव नारॉफ के नेतृत्व में किया गया था, जो स्टेपस्टोन से नेक्स्ट में सम्मिलित हुए थे। जीएनयू पब्लिक लाइसेंस लाइसेंस नियमो के अनुसार संकलक परिवर्तन उपलब्ध कराए गए थे, लेकिन रनटाइम पुस्तकालय नहीं थे, जो खुले स्रोत के योगदान को सामान्य जनता के लिए अनुपयोगी बना रहे थे। इसने अन्य पार्टियों को ओपन सोर्स लाइसेंस के अनुसार ऐसी रनटाइम लाइब्रेरी विकसित करने के लिए प्रेरित किया। बाद में, क्लैंग के लिए ऑब्जेक्टिव-सी फ्रंटएंड बनाने के लिए एप्पल में काम करने के लिए स्टीव नारॉफ का भी प्रमुख योगदान था।

जीएनयू परियोजना ने ओपनस्टेप मानक के आधार पर जीएनयूस्टेप नामक कोको (एपीआई) के अपने मुफ्त सॉफ्टवेयर कार्यान्वयन पर काम प्रारंभ किया।[10] डेनिस ग्लैटिंग ने 1992 में पहला जीएनयू ऑब्जेक्टिव-सी रन टाइम प्रणाली लिखा था। जीएनयू ऑब्जेक्टिव-सी रनटाइम, जो 1993 से उपयोग में है, क्रेस्टन क्रैब थोरुप द्वारा विकसित किया गया है जब वह डेनमार्क में विश्वविद्यालय के छात्र थे। थोरुप ने 1993 से 1996 तक नेक्स्ट में भी काम किया।[11]


एप्पल विकास और स्विफ्ट

1996 में नेक्स्ट को प्राप्त करने के बाद, एप्पल कंप्यूटर ने अपने तत्कालीन नए ऑपरेटिंग प्रणाली, मैक ओयस एक्स में ओपनस्टेप का उपयोग किया। इसमें उद्देश्य सी, नेक्स्ट का उद्देश्य सी- आधारित डेवलपर उपकरण, प्रोजेक्ट बिल्डर और इसका इंटरफ़ेस डिज़ाइन उपकरण, इंटरफ़ेस बिल्डर सम्मिलित थे। दोनों को बाद में एक एप्लिकेशन, एक्सकोड में मिला दिया गया। एप्पल का अधिकांश वर्तमान कोको (एपीआई) ओपनस्टेप इंटरफ़ेस ऑब्जेक्ट्स पर आधारित है और सक्रिय विकास के लिए उपयोग किया जा रहा सबसे महत्वपूर्ण ऑब्जेक्टिव-सी वातावरण है।

डब्ल्यूडब्ल्यूडीसी 2014 में, एप्पल ने नई भाषा, स्विफ्ट (प्रोग्रामिंग भाषा) प्रस्तुत की, जिसे सी के बिना ऑब्जेक्टिव-सी के रूप में चित्रित किया गया था।

सिंटेक्स

ऑब्जेक्टिव-सी सी (प्रोग्रामिंग भाषा) के ऊपर पतली परत है और सी का सख्त सुपरसेट है, जिसका अर्थ है कि किसी भी सी प्रोग्राम को ऑब्जेक्टिव-सी कंपाइलर के साथ संकलित करना और ऑब्जेक्टिव-सी क्लास के अन्दर सी भाषा कोड को स्वतंत्र रूप से सम्मिलित करना संभव है।[12][13][14][15][16][17]

ऑब्जेक्टिव-सी स्मॉलटाक से अपना ऑब्जेक्ट सिंटैक्स प्राप्त करता है। गैर-ऑब्जेक्ट-ओरिएंटेड ऑपरेशंस के लिए सभी सिंटैक्स (आदिम चर, प्री-प्रोसेसिंग, एक्सप्रेशन, फलन डिक्लेरेशन और फलन कॉल सहित) सी के समान हैं, जबकि ऑब्जेक्ट-ओरिएंटेड सुविधाओं के लिए सिंटैक्स स्मालटाक का कार्यान्वयन है।

संदेश

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का ऑब्जेक्टिव-सी मॉडल ऑब्जेक्ट इंस्टेंस को भेजे जाने वाले संदेश पर आधारित है। ऑब्जेक्टिव-सी में कोई विधि नहीं कहता है; संदेश भेजता है। यह सी ++ द्वारा उपयोग किए जाने वाले प्रारंभ- शैली प्रोग्रामिंग मॉडल के विपरीत है। इन दो अवधारणाओं के बीच का अंतर यह है कि विधि या संदेश नाम से संदर्भित कोड को कैसे निष्पादित किया जाता है। सिमुला-शैली की भाषा में, विधि का नाम अधिकांशतः स्थितियों में संकलक द्वारा लक्ष्य वर्ग में कोड के खंड के लिए बाध्यकारी होता है। स्मॉलटॉक और ऑब्जेक्टिव-सी में, संदेश का लक्ष्य रनटाइम पर हल किया जाता है, जिसमें प्राप्त वस्तु स्वयं संदेश की व्याख्या करती है। चयनकर्ता या द्वारा विधि की पहचान की जाती है SEL — प्रत्येक संदेश नाम के लिए अद्वितीय पहचानकर्ता, अधिकांशतः केवल अशक्त-समाप्त स्ट्रिंग एनयूएल-टर्मिनेटेड स्ट्रिंग इसके नाम का प्रतिनिधित्व करती है - और इसे प्रयुक्त करने वाले सी मेथड सूचक (कंप्यूटर प्रोग्रामिंग) के लिए हल किया गया: IMP.[18] इसका परिणाम यह है कि संदेश-पासिंग प्रणाली में कोई प्रकार की जाँच नहीं होती है। जिस वस्तु को संदेश निर्देशित किया गया है - प्राप्तकर्ता - को संदेश का उत्तर देने की जिम्मेदारी नहीं है, और यदि ऐसा नहीं होता है, तो यह अपवाद उठाता है।[19]

संदेश भेज रहा हूँ विधि सूचक द्वारा इंगित वस्तु के लिए ओबीजे सी ++ में निम्नलिखित कोड की आवश्यकता होगी:

obj->method(argument);

ऑब्जेक्टिव-सी में, इसे इस प्रकार लिखा गया है:

[obj method:argument];

मेथड कॉल का कंपाइलर द्वारा अनुवाद किया जाता है objc_msgSend(id self, SEL op, ...) रनटाइम कार्यों का परिवार। विभिन्न कार्यान्वयन आधुनिक परिवर्धन को संभालते हैं जैसे super.[20] जीएनयू परिवारों में इस प्रणाली का नाम है objc_msg_sendv, लेकिन इसके अनुसार आधुनिक लुकअप प्रणाली के पक्ष में इसे बहिष्कृत कर दिया गया है objc_msg_lookup.[21]

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

इंटरफेस और कार्यान्वयन

उद्देश्य-सी के लिए आवश्यक है कि एक वर्ग का इंटरफ़ेस और कार्यान्वयन अलग-अलग घोषित कोड ब्लॉक में हो। परिपाटी के अनुसार, डेवलपर्स इंटरफ़ेस को हेडर फ़ाइल में और कार्यान्वयन को कोड फ़ाइल में रखते हैं। हेडर फाइल, सामान्य रूप से .एच, सी हेडर फाइलों के समान होती हैं, जबकि कार्यान्वयन (विधि) फाइलें, सामान्य रूप से प्रत्ययित होती हैं। एम, सी कोड फाइलों के समान हो सकती हैं।

इंटरफ़ेस

यह अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं, जैसे सी++ या पायथन में उपयोग की जाने वाली क्लास डिक्लेरेशन के अनुरूप है।

किसी वर्ग का इंटरफ़ेस सामान्यतः हेडर फ़ाइल में परिभाषित किया जाता है। वर्ग के नाम के बाद हेडर फ़ाइल का नाम देना सामान्य परंपरा है, उदा। Ball.h वर्ग के लिए इंटरफ़ेस सम्मिलित होगा Ball.

इंटरफ़ेस घोषणा प्रपत्र लेती है:

@interface classname : superclassname {
  // instance variables
}
+ classMethod1;
+ (return_type)classMethod2;
+ (return_type)classMethod3:(param1_type)param1_varName;

- (return_type)instanceMethod1With1Parameter:(param1_type)param1_varName;
- (return_type)instanceMethod2With2Parameters:(param1_type)param1_varName
                              param2_callName:(param2_type)param2_varName;
@end

उपरोक्त में, प्लस चिह्न वर्ग विधियों, या विधियों को निरूपित करते हैं जिन्हें कक्षा में ही बुलाया जा सकता है (उदाहरण पर नहीं), और ऋण चिह्न उदाहरण विधियों को दर्शाते हैं, जिन्हें केवल कक्षा के किसी विशेष उदाहरण पर ही बुलाया जा सकता है। क्लास के विधियों की भी उदाहरण चर तक पहुंच नहीं है।


ऊपर दिया गया कोड सामान्यता निम्नलिखित सी++ इंटरफ़ेस के बराबर है:

class classname : public superclassname {
protected:
  // instance variables

public:
  // Class (static) functions
  static void *classMethod1();
  static return_type classMethod2();
  static return_type classMethod3(param1_type param1_varName);

  // Instance (member) functions
  return_type instanceMethod1With1Parameter(param1_type param1_varName);
  return_type
  instanceMethod2With2Parameters(param1_type param1_varName,
                                 param2_type param2_varName = default);
};

ध्यान दें कि instanceMethod2With2Parameters:param2_callName: तर्क अभिव्यक्तियों के साथ चयनकर्ता खंडों के अंतःक्रिया को प्रदर्शित करता है, जिसके लिए सी सी ++ में कोई प्रत्यक्ष समकक्ष नहीं है।

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

विधि तर्क नाम के साथ प्रारंभ होता है जो उस तर्क को लेबल करता है जो विधि नाम का भाग है, उसके बाद कोलन के बाद कोष्ठक में अपेक्षित तर्क प्रकार और तर्क नाम होता है। लेबल छोड़ा जा सकता है।

- (void)setRangeStart:(int)start end:(int)end;
- (void)importDocumentWithName:(NSString *)name
      withSpecifiedPreferences:(Preferences *)prefs
                    beforePage:(int)insertPage;

इंटरफ़ेस परिभाषा का व्युत्पन्न श्रेणी है, जो किसी को वर्त्तमान कक्षाओं में विधियों को जोड़ने की अनुमति देता है।[22]


कार्यान्वयन

इंटरफ़ेस केवल क्लास इंटरफ़ेस की घोषणा करता है न कि स्वयं विधियों की: वास्तविक कोड कार्यान्वयन फ़ाइल में लिखा गया है। कार्यान्वयन (विधि) फ़ाइलों में सामान्य रूप से फ़ाइल एक्सटेंशन होता है .ऍम, जो मूल रूप से संदेशों को दर्शाता था।[23]

@implementation classname
+ (return_type)classMethod {
  // implementation
}
- (return_type)instanceMethod {
  // implementation
}
@end


विधियों को उनके इंटरफ़ेस घोषणाओं का उपयोग करके लिखा गया है। ऑब्जेक्टिव-सी और सी की तुलना:

- (int)method:(int)i {
  return [self square_root:i];
}
int function(int i) {
  return square_root(i);
}

सिंटैक्स छद्म-नामित पैरामीटर की अनुमति देता है।

- (void)changeColorToRed:(float)red green:(float)green blue:(float)blue {
  //... Implementation ...
}

// Called like so:
[myColor changeColorToRed:5.0 green:2.0 blue:6.0];

उद्देश्य-सी के विभिन्न कार्यान्वयनों के बीच एक विधि का आंतरिक प्रतिनिधित्व भिन्न होता है। अगर मायकोलोर क्लास का है Color, उदाहरण विधि -changeColorToRed:green:blue: आंतरिक रूप से लेबल किया जा सकता है _i_Color_changeColorToRed_green_blue. i }} क्लास के साथ इंस्टेंस विधि को संदर्भित करना है और फिर विधि के नाम जोड़े गए हैं और कोलन अंडरस्कोर में बदल गए हैं। जैसा कि मापदंडों का क्रम विधि नाम का भाग है, इसे कोडिंग शैली या अभिव्यक्ति के अनुरूप नहीं बदला जा सकता है, जैसा कि सही नाम वाले मापदंडों के साथ है।

चुकी, फलन के आंतरिक नाम शायद ही कभी सीधे उपयोग किए जाते हैं। सामान्यतः, संदेश ऑब्जेक्टिव-सी रनटाइम लाइब्रेरी में परिभाषित फलन कॉल में परिवर्तित हो जाते हैं। यह आवश्यक रूप से लिंक समय पर ज्ञात नहीं है कि किस विधि को बुलाया जाएगा क्योंकि प्राप्त करने की कक्षा (वस्तु को संदेश भेजा जा रहा है) को रनटाइम तक ज्ञात नहीं होना चाहिए।

तात्कालिकता

एक बार ऑब्जेक्टिव-सी क्लास लिखे जाने के बाद, इसे तत्काल किया जा सकता है। यह पहले वर्ग ( वस्तु) के गैर-प्रारंभिक उदाहरण को आवंटित करके और फिर इसे आरंभ करके किया जाता है। जब तक दोनों चरण पूरे नहीं हो जाते, तब तक कोई वस्तु पूरी तरह कार्यात्मक नहीं होती है। इन चरणों को कोड की पंक्ति के साथ पूरा किया जाना चाहिए ताकि कभी भी आवंटित वस्तु न हो जो प्रारंभिक नहीं हुई है (और क्योंकि यह मध्यवर्ती परिणाम रखने के लिए नासमझी है -init जिस पर इसे कहा जाता है उससे भिन्न वस्तु वापस कर सकता है)।

डिफ़ॉल्ट, नो-पैरामीटर इनिशियलाइज़र के साथ इंस्टेंटेशन:

MyObject *foo = MyObject alloc] init];

कस्टम प्रारंभकर्ता के साथ तात्कालिकता:

MyObject *foo = MyObject alloc] initWithString:myString];

ऐसे स्थितियों में जहां कोई कस्टम प्रारंभ नहीं किया जा रहा है, आवंटन-इनिट संदेशों के स्थान पर अधिकांशतः नई विधि का उपयोग किया जा सकता है:

MyObject *foo = [MyObject new];

इसके अतिरिक्त, कुछ वर्ग क्लास मेथड इनिशियलाइज़र को प्रयुक्त करते हैं। पसंद +new, वे गठबंधन करते हैं +alloc और -init, लेकिन इसके विपरीत +new, वे ऑटोरेलेज्ड उदाहरण लौटाते हैं। कुछ क्लास मेथड इनिशियलाइज़र पैरामीटर लेते हैं:

MyObject *foo = [MyObject object];
MyObject *bar = [MyObject objectWithString:@"Wikipedia :)"];

आबंटन संदेश किसी वस्तु के लिए सभी उदाहरण चर को रखने के लिए पर्याप्त मेमोरी आवंटित करता है, सभी उदाहरण चर को शून्य मानों पर सेट करता है, और स्मृति को वर्ग के उदाहरण में बदल देता है; प्रारंभिकरण के समय किसी भी समय स्मृति सुपरक्लास का उदाहरण नहीं है।

लिनित संदेश निर्माण पर उदाहरण का सेट-अप करता है। लिनित विधि को अधिकांशतः इस प्रकार लिखा जाता है:

- (id)init {
    self = [super init];
    if (self) {
        // perform initialization of object here
    }
    return self;
}

उपरोक्त उदाहरण में, ध्यान दें id वापसी का प्रकार। यह प्रकार उद्देश्य सी में किसी भी वस्तु के सूचक के लिए खड़ा है (गतिशील टाइपिंग अनुभाग देखें)।

इनिशियलाइज़र पैटर्न का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को उसके सुपरक्लास द्वारा ठीक से इनिशियलाइज़ किया जाता है, इससे पहले कि इनिट मेथड अपना इनिशियलाइज़ेशन करता है। यह निम्नलिखित क्रियाएं करता है:

  • लाइन 2
    सुपरक्लास उदाहरण को एन आई टी संदेश भेजता है और स्वयं को परिणाम प्रदान करता है (वर्तमान वस्तु के लिए सूचक)।
  • पंक्ति 3
    जाँचता है कि क्या लौटाया गया ऑब्जेक्ट पॉइंटर किसी भी इनिशियलाइज़ेशन को करने से पहले वैध है।
  • पंक्ति 6
    कॉल करने वाले को स्वयं का मान लौटाता है।

गैर-वैध प्रतिरूप पॉइंटर का मान शून्य होता है; सशर्त बात जैसे अगर शून्य को शून्य सूचक की तरह मानते हैं, तो प्रारंभिक कोड को निष्पादित नहीं किया जाएगा [super init] शून्य लौटा। यदि इनिशियलाइज़ेशन में कोई त्रुटि है, तो इनिट मेथड को कोई भी आवश्यक सफाई करनी चाहिए, जिसमें स्वयं को रिलीज़ संदेश भेजना सम्मिलित है, और यह इंगित करने के लिए कि इनिशियलाइज़ेशन विफल हो गया है, वापस लौटें। ऐसी त्रुटियों के लिए कोई भी जाँच केवल सुपरक्लास इनिशियलाइज़ेशन को कॉल करने के बाद ही की जानी चाहिए ताकि यह सुनिश्चित हो सके कि वस्तु को नष्ट करना सही विधियों से किया जाएगा।

यदि किसी वर्ग में एक से अधिक इनिशियलाइज़ेशन मेथड हैं, तो उनमें से केवल (नामित इनिशियलाइज़र) को इस पैटर्न का पालन करने की आवश्यकता है; दूसरों को सुपरक्लास इनिशियलाइज़र के अतिरिक्त नामित इनिशियलाइज़र को कॉल करना चाहिए।

प्रोटोकॉल

अन्य प्रोग्रामिंग भाषाओं में, इन्हें इंटरफेस कहा जाता है।

प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) की प्रारंभ के माध्यम से विनिर्देशन की एकाधिक विरासत की अवधारणा को प्रस्तुत करने के लिए ऑब्जेक्टिव-सी को नेक्स्ट में विस्तारित किया गया था, लेकिन कार्यान्वयन नहीं। यह ऐसा पैटर्न है जिसे या तो सी++ में एब्स्ट्रैक्ट मल्टीपल इनहेरिटेड बेस क्लास के रूप में, या एक इंटरफ़ेस के रूप में प्राप्त किया जा सकता है (जैसा कि जावा और सी सार्प (प्रोग्रामिंग भाषा)|सी#) में है। ऑब्जेक्टिव-सी तदर्थ प्रोटोकॉल का उपयोग करता है जिसे अनौपचारिक प्रोटोकॉल कहा जाता है और कंपाइलर-प्रयुक्त प्रोटोकॉल जिसे औपचारिक प्रोटोकॉल कहा जाता है।

अनौपचारिक प्रोटोकॉल विधियों की सूची है जिसे वर्ग प्रयुक्त करने का विकल्प चुन सकता है। यह दस्तावेज़ीकरण में निर्दिष्ट है, क्योंकि इसकी भाषा में कोई उपस्थिति नहीं है। अनौपचारिक प्रोटोकॉल एनएसओब्जेक्ट पर ऑब्जेक्टिव-सी श्रेणियों (नीचे देखें) के रूप में प्रयुक्त किए जाते हैं और अधिकांशतः वैकल्पिक विधियों को सम्मिलित करते हैं, जो प्रयुक्त होने पर, कक्षा के व्यवहार को बदल सकते हैं। उदाहरण के लिए, टेक्स्ट फ़ील्ड क्लास में प्रतिनिधिमंडल (प्रोग्रामिंग) हो सकता है जो उपयोगकर्ता द्वारा टाइप किए गए टेक्स्ट को स्वत: पूर्ण करने के लिए वैकल्पिक विधि के साथ अनौपचारिक प्रोटोकॉल प्रयुक्त करता है। पाठ क्षेत्र पता लगाता है कि क्या प्रतिनिधि उस विधि को प्रयुक्त करता है (प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) के माध्यम से) और, यदि ऐसा है, तो स्वत: पूर्ण सुविधा का समर्थन करने के लिए प्रतिनिधि की विधि को कॉल करता है।

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

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

@protocol NSLocking
- (void)lock;
- (void)unlock;
@end

दर्शाता है कि लॉकिंग का अमूर्त विचार है। कक्षा परिभाषा में बताते हुए कि प्रोटोकॉल प्रयुक्त किया गया है,

@interface NSLock : NSObject <NSLocking>
// ...
@end

एनएसएलॉक के उदाहरण दावा करते हैं कि वे दो उदाहरण विधियों के लिए कार्यान्वयन प्रदान करेंगे।

गतिशील टाइपिंग

ऑब्जेक्टिव-सी, स्मॉलटॉक की तरह, डायनेमिक टाइपिंग का उपयोग कर सकता है: ऑब्जेक्ट को संदेश भेजा जा सकता है जो इसके इंटरफ़ेस में निर्दिष्ट नहीं है। यह बढ़े हुए लचीलेपन की अनुमति दे सकता है, क्योंकि यह वस्तु को संदेश को पकड़ने और अलग वस्तु को संदेश भेजने की अनुमति देता है जो संदेश को उचित रूप से प्रतिक्रिया दे सकता है, या इसी तरह संदेश को किसी अन्य वस्तु पर भेज सकता है। इस व्यवहार को संदेश अग्रेषण या प्रतिनिधिमंडल के रूप में जाना जाता है (नीचे देखें)। वैकल्पिक रूप से, संदेश को अग्रेषित नहीं किए जाने की स्थिति में त्रुटि हैंडलर का उपयोग किया जा सकता है। यदि कोई वस्तु किसी संदेश को अग्रेषित नहीं करती है, उसका उत्तर नहीं देती है, या किसी त्रुटि को संभालती है, तो प्रणाली रनटाइम अपवाद उत्पन्न करेगा।[24] यदि संदेश शून्य (अशक्त वस्तु सूचक) को भेजे जाते हैं, तो उन्हें संकलक विकल्पों के आधार पर चुपचाप अनदेखा कर दिया जाएगा या सामान्य अपवाद उठाया जाएगा।

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

- (void)setMyValue:(id)foo;

उपरोक्त कथन में फू किसी भी वर्ग का हो सकता है।

- (void)setMyValue:(id<NSCopying>)foo;

उपरोक्त कथन में, किसी भी वर्ग का उदाहरण हो सकता है जो इसके अनुरूप होNSसीopyingशिष्टाचार।

- (void)setMyValue:(NSNumber *)foo;

उपरोक्त बयान में, फू एनएसनंबर वर्ग का उदाहरण होना चाहिए।

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

अग्रेषण

उद्देश्य-सी किसी वस्तु को संदेश भेजने की अनुमति देता है जो प्रतिक्रिया नहीं दे सकता है। संदेश का उत्तर देने या बस छोड़ने के अतिरिक्त, वस्तु संदेश को उस वस्तु को अग्रेषित कर सकती है जो प्रतिक्रिया दे सकती है। अग्रेषण का उपयोग कुछ डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) के कार्यान्वयन को सरल बनाने के लिए किया जा सकता है, जैसे पर्यवेक्षक पैटर्न या प्रॉक्सी पैटर्न

ऑब्जेक्टिव-सी रनटाइम विधियों की जोड़ी निर्दिष्ट करता है ऑब्जेक्ट

  • अग्रेषण विधियाँ:
- (retval_t)forward:(SEL)sel args:(arglist_t)args; // with GCC
- (id)forward:(SEL)sel args:(marg_list)args; // with NeXT/Apple systems
  • क्रिया के विधियों:
- (retval_t)performv:(SEL)sel args:(arglist_t)args; // with GCC
- (id)performv:(SEL)sel args:(marg_list)args; // with NeXT/Apple systems

अग्रेषण को प्रयुक्त करने की इच्छा रखने वाली वस्तु को अग्रेषण व्यवहार को परिभाषित करने के लिए केवल नई विधि के साथ अग्रेषण विधि को ओवरराइड करने की आवश्यकता होती है। क्रिया विधि performv:: ओवरराइड करने की आवश्यकता नहीं है, क्योंकि यह विधि चयनकर्ता और तर्कों के आधार पर केवल क्रिया करती है। ध्यान दें SEL प्रकार, जो ऑब्जेक्टिव-सी में संदेशों का प्रकार है।

नोट: ओपनस्टेप, कोको, और जीएनयूस्टेप में, ऑब्जेक्टिव-सी के सामान्यतः उपयोग किए जाने वाले ढांचे, कोई इसका उपयोग नहीं करता है Object कक्षा। - (void)forwardInvocation:(NSInvocation *)anInvocation }} की विधि NSObject अग्रेषण करने के लिए कक्षा का उपयोग किया जाता है।

उदाहरण

यहां प्रोग्राम का उदाहरण दिया गया है जो अग्रेषण की मूल बातें प्रदर्शित करता है।

फारवर्डर.ए
#import <objc/Object.h>

@interface Forwarder : Object {
  id recipient; // The object we want to forward the message to.
}

// Accessor methods.
- (id)recipient;
- (id)setRecipient:(id)_recipient;
@end
फारवर्डर.एम
#import "Forwarder.h"

@implementation Forwarder
- (retval_t)forward:(SEL)sel args:(arglist_t)args {
  /*
  * Check whether the recipient actually responds to the message.
  * This may or may not be desirable, for example, if a recipient
  * in turn does not respond to the message, it might do forwarding
  * itself.
  */
  if ([recipient respondsToSelector:sel]) {
    return [recipient performv:sel args:args];
  } else {
    return [self error:"Recipient does not respond"];
  }
}

- (id)setRecipient:(id)_recipient {
  [recipient autorelease];
  recipient = [_recipient retain];
  return self;
}

- (id)recipient {
  return recipient;
}
@end
प्राप्तकर्ता.एच
#import <objc/Object.h>

// A simple Recipient object.
@interface Recipient : Object
- (id)hello;
@end
प्राप्तकर्ता.एम
#import "Recipient.h"

@implementation Recipient

- (id)hello {
  printf("Recipient says hello!\n");

  return self;
}

@end
मुख्य.एम
#import "Forwarder.h"
#import "Recipient.h"

int main(void) {
  Forwarder *forwarder = [Forwarder new];
  Recipient *recipient = [Recipient new];

  [forwarder setRecipient:recipient]; // Set the recipient.
  /*
  * Observe forwarder does not respond to a hello message! It will
  * be forwarded. All unrecognized methods will be forwarded to
  * the recipient
  * (if the recipient responds to them, as written in the Forwarder)
  */
  [forwarder hello];

  [recipient release];
  [forwarder release];

  return 0;
}

टिप्पणियाँ

जब जीसीसी का उपयोग करके संकलित किया जाता है, तो संकलक रिपोर्ट करता है:

$ gcc -x objective-c -Wno-import Forwarder.m Recipient.m main.m -lobjc
main.m: In function `main':
main.m:12: warning: `Forwarder' does not respond to `hello'
$

संकलक पहले की गई बात की रिपोर्ट कर रहा है, कि  फारवर्डर हैलो संदेशों का उत्तर नहीं देता है। इस परिस्थिति में, अग्रेषण प्रयुक्त होने के बाद से चेतावनी को अनदेखा करना सुरक्षित है। प्रोग्राम चलाने से यह आउटपुट उत्पन्न होता है:

$ ./a.out
Recipient says hello!


श्रेणियाँ

ऑब्जेक्टिव-सी के डिजाइन के समय, मुख्य चिंताओं में से बड़े कोड आधारों की अनुरक्षणीयता थी। संरचित प्रोग्रामिंग दुनिया के अनुभव ने दिखाया था कि कोड को सुधारने के मुख्य विधियों में से इसे छोटे टुकड़ों में तोड़ना था। ऑब्जेक्टिव-सी ने इस प्रक्रिया में सहायता करने के लिए स्मॉलटाक कार्यान्वयन से श्रेणियों की अवधारणा को उधार लिया और विस्तारित किया।[25]

इसके अतिरिक्त, किसी श्रेणी के विधियों को रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम पर वर्ग में जोड़ा जाता है। इस प्रकार, श्रेणियां प्रोग्रामर को किसी वर्त्तमान वर्ग - ओपन क्लास (कंप्यूटर प्रोग्रामिंग) में विधियों को जोड़ने की अनुमति देती हैं - उस वर्ग को पुन: संकलित करने की आवश्यकता के बिना या इसके स्रोत कोड तक पहुंच भी। उदाहरण के लिए, यदि किसी प्रणाली में इसके स्ट्रिंग कार्यान्वयन में बानान चेकर नहीं है, तो इसे स्ट्रिंग स्रोत कोड को संशोधित किए बिना जोड़ा जा सकता है।

जब प्रोग्राम चलाया जाता है तो श्रेणियों के अन्दर के विधियों में वर्ग के विधियों से अप्रभेद्य हो जाते हैं। श्रेणी के पास निजी चर सहित कक्षा के अन्दर सभी इंस्टेंस चरों तक पूर्ण पहुंच होती है।

यदि कोई श्रेणी किसी वर्ग में वर्त्तमान विधि के समान विधि हस्ताक्षर के साथ विधि घोषित करती है, तो श्रेणी की विधि अपनाई जाती है। इस प्रकार श्रेणियां न केवल वर्ग में विधियाँ जोड़ सकती हैं, बल्कि वर्त्तमान विधियों को भी प्रतिस्थापित कर सकती हैं। इस सुविधा का उपयोग अन्य कक्षाओं में उनके विधियों को फिर से लिखकर बग को ठीक करने के लिए किया जा सकता है, या किसी प्रोग्राम के अन्दर कक्षा के व्यवहार में वैश्विक परिवर्तन का कारण बन सकता है। यदि दो श्रेणियों में एक ही नाम के विधियों हैं लेकिन अलग-अलग विधि हस्ताक्षर हैं, तो यह अपरिभाषित है कि किस श्रेणी की विधि को अपनाया गया है।

अन्य भाषाओं ने इस सुविधा को विभिन्न विधियों से जोड़ने का प्रयास किया है। टॉम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा) ने ऑब्जेक्टिव-सी प्रणाली को एक कदम आगे बढ़ाया और वेरिएबल्स को भी जोड़ने की अनुमति दी। अन्य भाषाओं ने इसके अतिरिक्त प्रोटोटाइप-आधारित प्रोग्रामिंग प्रोटोटाइप-आधारित समाधानों का उपयोग किया है, सबसे उल्लेखनीय स्वयं (प्रोग्रामिंग भाषा) है।

सी# और विजुअल बेसिक.नेट भाषाएँ विस्तार विधियों के रूप में सतही रूप से समान कार्यक्षमता को प्रयुक्त करती हैं, लेकिन इनमें कक्षा के निजी चरों तक पहुँच की कमी होती है।[26] रूबी (प्रोग्रामिंग भाषा) और कई अन्य गतिशील प्रोग्रामिंग भाषाएं तकनीक को बंदर पैच के रूप में संदर्भित करती हैं।

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

श्रेणियों का उदाहरण उपयोग

यह उदाहरण एक बनाता है पूर्णांक कक्षा, पहले बुनियादी वर्ग को केवल विधि (कंप्यूटर विज्ञान) के साथ परिभाषित करके, और दो श्रेणियों को जोड़कर, अंकगणित और दिखाना, जो मूल वर्ग का विस्तार करते हैं। जबकि श्रेणियां बेस क्लास के निजी डेटा सदस्यों तक पहुंच सकती हैं, इन निजी डेटा सदस्यों को एक्सेसर विधियों के माध्यम से एक्सेस करना अधिकांशतः अच्छा अभ्यास होता है, जो श्रेणियों को बेस क्लास से अधिक स्वतंत्र रखने में सहायता करता है। ऐसे एक्सेसर्स को प्रयुक्त करना श्रेणियों का विशिष्ट उपयोग है। दूसरा आधार वर्ग में विधियों को जोड़ने के लिए श्रेणियों का उपयोग करना है। चुकी, इसे उपवर्ग ओवरराइडिंग के लिए श्रेणियों का उपयोग करने के लिए अच्छा अभ्यास नहीं माना जाता है, जिसे मंकी पैचिंग भी कहा जाता है। अनौपचारिक प्रोटोकॉल को आधार पर श्रेणी के रूप में प्रयुक्त किया जाता है एनएसओब्जेक्ट कक्षा। परिपाटी के अनुसार, बेस क्लास का विस्तार करने वाली श्रेणियों वाली फाइलों का नाम बेसक्लास+एक्सटेंशनक्लास.एच होगा।

पूर्णांक.एच
#import <objc/Object.h>

@interface Integer : Object {
  int integer;
}

- (int)integer;
- (id)integer:(int)_integer;
@end
पूर्णांक.एम
#import "Integer.h"

@implementation Integer
- (int) integer {
  return integer;
}

- (id) integer: (int) _integer {
  integer = _integer;
  return self;
}
@end
पूर्णांक+अंकगणित.एच
#import "Integer.h"

@interface Integer (Arithmetic)
- (id) add: (Integer *) addend;
- (id) sub: (Integer *) subtrahend;
@end
पूर्णांक+अंकगणित.m
#import "Integer+Arithmetic.h"

@implementation Integer (Arithmetic)
- (id) add: (Integer *) addend {
  return [self integer: [self integer] + [addend integer]];
}

- (id) sub: (Integer *) subtrahend {
  return [self integer: [self integer] - [subtrahend integer]];
}
@end
पूर्णांक+डिस्प्ले.एच
#import "Integer.h"

@interface Integer (Display)
- (id) showstars;
- (id) showint;
@end
पूर्णांक+डिस्प्ले.एम
# import "Integer+Display.h"

@implementation Integer (Display)
- (id) showstars {
  int i, x = [self integer];
  for (i = 0; i < x; i++) {
    printf("*");
  }
  printf("\n");

  return self;
}

- (id) showint {
  printf("%d\n", [self integer]);

  return self;
}
@end
मुख्य.एम
#import "Integer.h"
#import "Integer+Arithmetic.h"
#import "Integer+Display.h"

int main(void) {
  Integer *num1 = [Integer new], *num2 = [Integer new];
  int x;

  printf("Enter an integer: ");
  scanf("%d", &x);

  [num1 integer:x];
  [num1 showstars];

  printf("Enter an integer: ");
  scanf("%d", &x);

  [num2 integer:x];
  [num2 showstars];

  [num1 add:num2];
  [num1 showint];

  return 0;
}

टिप्पणियाँ

संकलन किया जाता है, उदाहरण के लिए, द्वारा:

$ gcc -x objective-c main.m Integer.m Integer+Arithmetic.m Integer+Display.m -lobjc

को छोड़कर प्रयोग कर सकते हैं #import "Integer+Arithmetic.h" (line 2) and [num1 add:num2] (line 21) and omitting Integer+Arithmetic.m in compilation.कार्यक्रम अभी भी चलेगा। इसका अर्थ यह है कि यदि आवश्यक हो तो अतिरिक्त श्रेणियों को मिलाना और मिलाना संभव है; यदि किसी श्रेणी में कुछ क्षमता की आवश्यकता नहीं है, तो उसे संकलित नहीं किया जा सकता है.


पोजिंग

ऑब्जेक्टिव-सी एक क्लास को प्रोग्राम के अन्दर दूसरी क्लास को पूरी तरह से बदलने की अनुमति देता है। प्रतिस्थापन वर्ग को लक्ष्य वर्ग के रूप में कहा जाता है।

क्लास पोज़िंग को मैक ओयस एक्स वी10.5 के साथ बहिष्कृत घोषित किया गया था, और 64-बिट रनटाइम में अनुपलब्ध है। इसी तरह की कार्यक्षमता श्रेणियों में विधि स्विज़लिंग का उपयोग करके प्राप्त की जा सकती है, जो विधि के कार्यान्वयन को दूसरे के साथ स्वैप करती है जिसमें समान हस्ताक्षर होते हैं।

पोज़िंग का समर्थन करने वाले संस्करणों के लिए, लक्ष्य वर्ग को भेजे गए सभी संदेश पोज़िंग क्लास द्वारा प्राप्त किए जाते हैं। कई प्रतिबंध हैं:

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

इसी तरह श्रेणियों के साथ प्रस्तुत करना, वर्त्तमान वर्गों के वैश्विक संवर्द्धन की अनुमति देता है। पोज़िंग परमिट दो सुविधाओं को श्रेणियों से अनुपस्थित करता है:

  • प्रस्तुत वर्ग सुपर के माध्यम से ओवरराइड विधियों को कॉल कर सकता है, इस प्रकार लक्ष्य वर्ग के कार्यान्वयन को सम्मिलित कर सकता है।
  • पोज़िंग क्लास श्रेणियों में परिभाषित विधियों को ओवरराइड कर सकती है।


उदाहरण के लिए,

@interface CustomNSApplication : NSApplication
@end

@implementation CustomNSApplication
- (void) setMainMenu: (NSMenu*) menu {
  // do something with menu
}
@end

class_poseAs ([CustomNSApplication class], [NSApplication class]);

यह सेटमेनमेनू के एनएसएप्लिकेशंस के प्रत्येक सामान्यंत्रण को रोकता है।

आयात

सी भाषा में, #include पूर्व-संकलन निर्देश हमेशा उस बिंदु पर फ़ाइल की सामग्री को स्रोत में डालने का कारण बनता है। ऑब्जेक्टिव-सी में है #import निर्देश, समतुल्य अतिरिक्त प्रत्येक फ़ाइल को प्रति संकलन इकाई में केवल एक बार सम्मिलित किया जाता है, जिसमें गार्ड सम्मिलित करने की आवश्यकता को कम किया जाता है।

लिनक्स जीसीसी संकलन

// FILE: hello.m
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
    /* my first program in Objective-C */
    NSLog(@"Hello, World! \n");
    return 0;
}
$ # Compile Command Line for gcc and MinGW Compiler:
$ gcc \
    $(gnustep-config --objc-flags) \
    -o hello \
    hello.m \
    -L /GNUstep/System/Library/Libraries \
    -lobjc \
    -lgnustep-base

$ ./hello

अन्य विशेषताएं

ऑब्जेक्टिव-सी की विशेषताएं अधिकांशतः प्रोग्रामिंग मुद्दों के लिए लचीले और अधिकांशतः आसान समाधान की अनुमति देती हैं।

  • श्रेणियों और संदेश अग्रेषण का उपयोग करके अन्य वस्तुओं और दूरस्थ प्रक्रिया कॉल के लिए प्रतिनिधि विधियों को सरलता से प्रयुक्त किया जा सकता है।
  • isa पॉइंटर का सूचक झूल रहा है कक्षाओं को रनटाइम में बदलने की अनुमति देता है। सामान्यतः डिबगिंग के लिए उपयोग किया जाता है जहां मुक्त वस्तुओं को ज़ोंबी वस्तुओं में घुमा दिया जाता है जिसका एकमात्र उद्देश्य किसी त्रुटि की रिपोर्ट करना है जब कोई उन्हें कॉल करता है। स्विज़लिंग का उपयोग एंटरप्राइज़ ऑब्जेक्ट फ्रेमवर्क में डेटाबेस दोष बनाने के लिए भी किया गया था। की-वैल्यू ऑब्जर्विंग को प्रयुक्त करने के लिए एप्पल के फाउंडेशन फ्रेमवर्क द्वारा आज स्विज़लिंग का उपयोग किया जाता है।

भाषा प्रकार

उद्देश्य-सी ++

उद्देश्य सी++ जीएनयू संकलक संग्रह और बजना के फ्रंट-एंड द्वारा स्वीकार किया गया भाषा संस्करण है, जो सी++ और उद्देश्य सी सिंटैक्स के संयोजन का उपयोग करने वाली स्रोत फ़ाइलों को संकलित कर सकता है। ऑब्जेक्टिव-सी++ सी++ में वे एक्सटेंशन जोड़ता है जो ऑब्जेक्टिव-सी सी में जोड़ता है। जैसा कि विभिन्न भाषा सुविधाओं के पीछे शब्दार्थ को एकीकृत करने के लिए कुछ भी नहीं किया जाता है, कुछ प्रतिबंध प्रयुक्त होते हैं:

  • सी ++ क्लास ऑब्जेक्टिव-सी क्लास से प्राप्त नहीं हो सकती है और इसके विपरीत।
  • सी ++ नेमस्पेस को उद्देश्य-सी घोषणा के अंदर घोषित नहीं किया जा सकता है।
  • उद्देश्य-सी घोषणाएं केवल वैश्विक दायरे में दिखाई दे सकती हैं, सी ++ नेमस्पेस के अंदर नहीं
  • उद्देश्य-सी कक्षाओं में सी ++ कक्षाओं के आवृत्ति चर नहीं हो सकते हैं जिनमें डिफ़ॉल्ट कंस्ट्रक्टर की कमी है या जिनमें एक या अधिक वर्चुअल विधियां हैं, लेकिन सी ++ ऑब्जेक्ट्स के पॉइंटर्स को प्रतिबंध के बिना उदाहरण चर के रूप में उपयोग किया जा सकता है (उन्हें -इनिट विधि में नए के साथ आवंटित करें)।
  • सी++ मूल्य शब्दार्थ द्वारा को उद्देश्य सी ऑब्जेक्ट्स पर प्रयुक्त नहीं किया जा सकता है, जो केवल पॉइंटर्स के माध्यम से एक्सेस किए जा सकते हैं।
  • उद्देश्य-सी घोषणा सी ++ टेम्पलेट घोषणा के अन्दर नहीं हो सकती है और इसके विपरीत। चुकी, ऑब्जेक्टिव-सी टाइप (जैसे, कक्षा का नाम) का उपयोग सी++ टेम्पलेट पैरामीटर के रूप में किया जा सकता है।
  • ऑब्जेक्टिव-सी और सी++ एक्सेप्शन हैंडलिंग अलग है; प्रत्येक के संचालक दूसरे प्रकार के अपवादों को संभाल नहीं सकते। परिणामस्वरुप , वस्तु विनाशक नहीं चलाए जाते हैं। हाल के ऑब्जेक्टिव-सी 2.0 रनटाइम में इसे कम किया गया है क्योंकि ऑब्जेक्टिव-सी अपवादों को या तो पूरी तरह से (ऐप्पल रनटाइम) सी ++ अपवादों द्वारा प्रतिस्थापित किया जाता है, या आंशिक रूप से जब ऑब्जेक्टिव-सी ++ लाइब्रेरी जुड़ा हुआ है (जीएनयूस्टेप libobjc2)।[27]
  • ऑब्जेक्टिव-सी ब्लॉक और सी++11 बेनामी फलन सी++ (सी++11 के बाद से) अलग-अलग संस्थाएं हैं। चुकीं, लैम्ब्डा पास करते समय मैक ओएस पर ब्लॉक पारदर्शी रूप से उत्पन्न होता है जहाँ ब्लॉक की उम्मीद होती है।[28]


उद्देश्य-सी 2.0

2006 के विश्वव्यापी डेवलपर्स सम्मेलन में, एप्पल ने उद्देश्य सी 2.0 को जारी करने की घोषणा की, उद्देश्य सी भाषा का संशोधन जिसमें आधुनिक कचरा संग्रह, सिंटैक्स संवर्द्धन,[29] रनटाइम प्रदर्शन में सुधार,[30] और 64-बिट समर्थन। मैक ओयस एक्स वी10.5, अक्टूबर 2007 में प्रयुक्त किया गया, जिसमें ऑब्जेक्टिव-सी 2.0 कंपाइलर सम्मिलित था। जीएनयू कम्पाइलर संग्रह जीसीसी 4.6 कई नई ऑब्जेक्टिव-सी सुविधाओं का समर्थन करता है, जैसे कि घोषित और संश्लेषित गुण, डॉट सिंटैक्स, तेज़ गणना, वैकल्पिक प्रोटोकॉल विधियाँ, विधि प्रोटोकॉल क्लास विशेषताएँ, क्लास एक्सटेंशन, और नया जीएनयू ऑब्जेक्टिव-सी रनटाइम एपीआई .[31]

नामकरण ऑब्जेक्टिव-सी 2.0 भाषा के संस्करण प्रणाली में विराम का प्रतिनिधित्व करता है, क्योंकि नेक्स्ट के लिए अंतिम ऑब्जेक्टिव-सी संस्करण ऑब्जेक्टिव था।[32] इस प्रोजेक्ट का नाम मैक ओयस एक्स लेओपोर्ड (10.5) में लीगेसी ऑब्जेक्टिव-सी रनटाइम सोर्स कोड की पिछली रिलीज़ में रखा गया था।[33]


कचरा संग्रह

उद्देश्य-सी 2.0 ने वैकल्पिक रूढ़िवादी, पीढ़ीगत कचरा संग्रह (कंप्यूटर विज्ञान) प्रदान किया। जब बैकवर्ड-संगत मोड में चलाया जाता है, तो रनटाइम संदर्भ गिनती ऑपरेशंस जैसे रिटेन और रिलीज को नो-ऑप्स में बदल देता है। कचरा संग्रह सक्षम होने पर सभी ऑब्जेक्ट कचरा संग्रह के अधीन थे। अंतर्निहित राइट-बैरियर कंपाइलर इंटरसेप्ट्स को ट्रिगर करने के लिए नियमित सी पॉइंटर्स को मजबूत के साथ योग्य किया जा सकता है और इस प्रकार कचरा संग्रह में भाग लेते हैं।[34] शून्य-इंग कमजोर सबप्रणाली भी प्रदान किया गया था जैसे कि कमजोर के रूप में चिह्नित पॉइंटर्स शून्य पर सेट होते हैं जब ऑब्जेक्ट (या अधिक सरलता से, जीसी मेमोरी) एकत्र किया जाता है। ऑब्जेक्टिव-सी 2.0 के आईओएस कार्यान्वयन पर कचरा संग्रहकर्ता उपस्थित नहीं है।[35] ऑब्जेक्टिव-सी में कचरा संग्रह कम प्राथमिकता वाले पृष्ठभूमि थ्रेड पर चलता है, और उपयोगकर्ता अनुभव को उत्तरदायी रखने के लक्ष्य से उपयोगकर्ता ईवेंट पर रोक सकता है।[36]

स्वचालित संदर्भ गणना (एआरसी) के पक्ष में मैक ओएस एक्स वी10.8 में कचरा संग्रह बहिष्कृत किया गया था।[37] एआरएम64 पर चल रहे आईओएस 7 पर उद्देश्य सी 64-बिट शब्द में से 19 बिट्स का उपयोग रेफरेंस काउंट को टैग किए गए पॉइंटर्स के रूप में स्टोर करने के लिए करता है।[38][39]


गुण

ऑब्जेक्टिव-सी 2.0 ऐक्सेसर विधियों की पीढ़ी को कॉन्फ़िगर करने के लिए वैकल्पिक विशेषताओं के साथ संपत्ति (प्रोग्रामिंग) के रूप में उदाहरण चर घोषित करने के लिए नया सिंटैक्स प्रस्तुत करता है। गुण, एक अर्थ में, सार्वजनिक उदाहरण चर हैं; यानी, संपत्ति के रूप में उदाहरण चर घोषित करना उस संपत्ति के लिए बाहरी कक्षाओं को पहुंच प्रदान करता है (संभवतः सीमित, उदाहरण के लिए केवल पढ़ने के लिए)। संपत्ति को केवल पढ़ने के लिए घोषित किया जा सकता है, और भंडारण शब्दार्थ जैसे कि प्रदान किया जा सकता है सौंपना, कॉपी या बनाए रखना. डिफ़ॉल्ट रूप से, गुणों पर विचार किया जाता है एटॉमिक, जिसके परिणामस्वरूप एक ही समय में कई थ्रेड्स को एक्सेस करने से रोकने वाला लॉक हो जाता है। संपत्ति के रूप में घोषित किया जा सकता है नोनाएटॉमिक, जो इस लॉक को हटा देता है।

@interface Person : NSObject {
@public
  NSString *name;
@private
  int age;
}

@property(copy) NSString *name;
@property(readonly) int age;

- (id)initWithAge:(int)age;
@end

गुणों के माध्यम से कार्यान्वित किया जाता है @synthesize कीवर्ड, जो संपत्ति घोषणा के अनुसार गेट्टर (और सेटर, यदि केवल पढ़ने के लिए नहीं) विधियों उत्पन्न करता है। वैकल्पिक रूप से, गेट्टर और सेटर विधियों को स्पष्ट रूप से प्रयुक्त किया जाना चाहिए, या @dynamic कीवर्ड का उपयोग यह इंगित करने के लिए किया जा सकता है कि एक्सेसर विधियां अन्य माध्यमों से प्रदान की जाएंगी। जब क्लैंग 3.1 या उच्चतर का उपयोग करके संकलित किया जाता है, तो सभी गुण जिन्हें स्पष्ट रूप से घोषित नहीं किया जाता है @डायनमिक, चिह्नित केवल पढ़ने के लिए या पूर्ण उपयोगकर्ता-कार्यान्वित गेट्टर है और सेटर स्वचालित रूप से निहित होगा @संश्लेषित'डी।

@implementation Person
@synthesize name;

- (id)initWithAge:(int)initAge {
  self = [super init];
  if (self) {
    // NOTE: direct instance variable assignment, not property setter
    age = initAge;
  }
  return self;
}

- (int)age {
  return age;
}
@end

गुणों को पारंपरिक संदेश पासिंग सिंटैक्स, डॉट नोटेशन, या, की-वैल्यू कोडिंग में, कुंजी के लिए मूल्य: /सेट कुंजी के लिए मूल्य: विधियों के माध्यम से नाम से एक्सेस किया जा सकता है।

Person *aPerson = [[Person alloc] initWithAge:53];
aPerson.name = @"Steve"; // NOTE: dot notation, uses synthesized setter,
                         // equivalent to [aPerson setName: @"Steve"];
NSLog(@"Access by message (%@), dot notation(%@), property name(% @) and "
       "direct instance variable access(% @) ",
              [aPerson name],
      aPerson.name, [aPerson valueForKey:@"name"], aPerson -> name);

उदाहरण विधि के अन्दर संपत्ति एक्सेसर्स को सामान्यंत्रित करने के लिए डॉट नोटेशन का उपयोग करने के लिए, स्वयं कीवर्ड का उपयोग किया जाना चाहिए:

- (void)introduceMyselfWithProperties:(BOOL)useGetter {
  NSLog(@"Hi, my name is %@.", (useGetter ? self.name : name));
  // NOTE: getter vs. ivar access
}

वर्ग या प्रोटोकॉल के गुण गतिशील रूप से टाइप आत्मनिरीक्षण हो सकते हैं।

int i;
int propertyCount = 0;
objc_property_t *propertyList =
    class_copyPropertyList([aPerson class], &propertyCount);

for (i = 0; i < propertyCount; i++) {
  objc_property_t *thisProperty = propertyList + i;
  const char *propertyName = property_getName(*thisProperty);
  NSLog(@"Person has a property: '%s'", propertyName);
}

गैर-नाज़ुक उदाहरण चर

ऑब्जेक्टिव-सी 2.0 गैर-नाजुक उदाहरण चर प्रदान करता है जहां रनटाइम द्वारा समर्थित होता है (यानी जब 64-बिट मैक ओएस और सभी आईओएस के लिए बिल्डिंग कोड होता है) आधुनिक रनटाइम के अनुसार, इंस्टेंस वेरिएबल एक्सेस में इंडिकेशन की अतिरिक्त परत जोड़ी जाती है, जिससे डायनेमिक लिंकर को रनटाइम पर इंस्टेंस लेआउट को समायोजित करने की अनुमति मिलती है। यह सुविधा ऑब्जेक्टिव-सी कोड में दो महत्वपूर्ण सुधारों की अनुमति देती है:

  • यह नाजुक बाइनरी इंटरफ़ेस समस्या को समाप्त करता है; सुपरक्लास बाइनरी संगतता को प्रभावित किए बिना आकार बदल सकते हैं।
  • यह इंस्टेंस वेरिएबल्स की अनुमति देता है जो गुणों को क्लास के इंटरफ़ेस में घोषित किए बिना रनटाइम पर संश्लेषित करने के लिए समर्थन प्रदान करते हैं।

फास्ट गणना

संग्रह के माध्यम से पुनरावृत्ति करने के लिए एनएसएन्यूमरेटर ऑब्जेक्ट या इंडेक्स का उपयोग करने के अतिरिक्त, ऑब्जेक्टिव-सी 2.0 तेज़ गणना सिंटैक्स प्रदान करता है। ऑब्जेक्टिव-सी 2.0 में, निम्नलिखित लूप कार्यात्मक रूप से समकक्ष हैं, लेकिन अलग-अलग प्रदर्शन गुण हैं।

// Using NSEnumerator
NSEnumerator *enumerator = [thePeople objectEnumerator];
Person *p;

while ((p = [enumerator nextObject]) != nil) {
  NSLog(@"%@ is %i years old.", [p name], [p age]);
}
// Using indexes
for (int i = 0; i < [thePeople count]; i++) {
  Person *p = [thePeople objectAtIndex:i];
  NSLog(@"%@ is %i years old.", [p name], [p age]);
}
// Using fast enumeration
for (Person *p in thePeople) {
  NSLog(@"%@ is %i years old.", [p name], [p age]);
}

तेज़ गणना मानक गणना की तुलना में अधिक कुशल कोड उत्पन्न करती है क्योंकि वस्तुओं पर गणना करने के लिए विधि कॉल को एनएस फास्टएन्यूमरेशन प्रोटोकॉल का उपयोग करके पॉइंटर अंकगणित द्वारा प्रतिस्थापित किया जाता है।[40]


कक्षा विस्तार

वर्ग विस्तार में श्रेणी घोषणा के समान सिंटैक्स होता है जिसमें कोई श्रेणी नाम नहीं होता है, और इसमें घोषित विधियों और गुणों को सीधे मुख्य वर्ग में जोड़ा जाता है। यह अधिकांशतः सार्वजनिक शीर्षकों में विज्ञापन के बिना वर्ग में विधियों को जोड़ने के लिए श्रेणी के विकल्प के रूप में उपयोग किया जाता है, इस लाभ के साथ कि वर्ग विस्तार के लिए संकलक जाँच करता है कि सभी निजी तौर पर घोषित विधियों वास्तव में प्रयुक्त किए गए हैं।[41]


कोको के विकास के लिए निहितार्थ

मैक ओयस के लिए विकसित सभी ऑब्जेक्टिव-सी एप्लिकेशन जो ऑब्जेक्टिव-सी 2.0 के लिए उपरोक्त सुधारों का उपयोग करते हैं, 10.5 (तेंदुए) से पहले के सभी ऑपरेटिंग प्रणाली के साथ असंगत हैं। चूँकि तेज़ गणना मानक गणना के समान बायनेरिज़ उत्पन्न नहीं करती है, इसके उपयोग से मैक ओएस एक्स संस्करण 10.4 या इससे पहले के संस्करण क्रैश हो जाएंगे।

ब्लॉक

ब्लॉक उद्देश्य-सी (और सी (प्रोग्रामिंग भाषा) और सी ++) के लिए गैर-मानक विस्तार है जो क्लोजर (प्रोग्रामिंग) बनाने के लिए विशेष सिंटैक्स का उपयोग करता है। ब्लॉक केवल मैक ओएस एक्स स्नो लेपर्ड| मैक ओएस एक्स 10.6 स्नो लेपर्ड या बाद के संस्करण, आईओएस 4 या उसके बाद के संस्करण, और ली बॉबजेसी2 1.7 के साथ जीएनयूस्टेप और क्लैंग 3.1 या बाद के संस्करण के साथ संकलन में समर्थित हैं।[42]

#include <stdio.h>
#include <Block.h>
typedef int (^IntBlock)();

IntBlock MakeCounter(int start, int increment) {
  __block int i = start;

  return Block_copy( ^ {
    int ret = i;
    i += increment;
    return ret;
  });

}

int main(void) {
  IntBlock mycounter = MakeCounter(5, 2);
  printf("First call: %d\n", mycounter());
  printf("Second call: %d\n", mycounter());
  printf("Third call: %d\n", mycounter());

  /* because it was copied, it must also be released */
  Block_release(mycounter);

  return 0;
}
/* Output:
  First call: 5
  Second call: 7
  Third call: 9
*/

आधुनिक उद्देश्य-सी

एप्पल ने समय के साथ ऑब्जेक्टिव 2.0 में कुछ अतिरिक्त सुविधाएँ जोड़ी हैं। जोड़ केवल एप्पल एलएलवीएम कंपाइलर पर प्रयुक्त होते हैं, यानी भाषा का क्लैंग फ्रंटएंड। भ्रामक रूप से, एप्पल द्वारा उपयोग किया जाने वाला संस्करण एलएलवीएम अपस्ट्रीम से भिन्न होता है; को देखें एक्सकोड § टूलचैन संस्करण ओपन-सोर्स एलएलवीएम संस्करण संख्या में अनुवाद के लिए।[43]


स्वचालित संदर्भ गणना

ऑटोमैटिक रेफरेंस काउंटिंग (आर्क) कंपाइल-टाइम विशेषता है जो प्रोग्रामर्स को मैन्युअल रूप से रिटेन काउंट्स को मैनेज करने की जरूरत को खत्म करता है retain और release.[44] कचरा संग्रह (कंप्यूटर विज्ञान) के विपरीत, जो रन टाइम पर होता है, एआरसी अलग प्रक्रिया के ऊपरी भागों को बनाए रखने की गिनती को प्रबंधित करता है। एआरसी और मैनुअल मेमोरी प्रबंधन परस्पर अनन्य नहीं हैं; प्रोग्रामर एआरसी-सक्षम परियोजनाओं में व्यक्तिगत कोड फ़ाइलों के लिए एआरसी को अक्षम करके गैर-एआरसी कोड का उपयोग करना जारी रख सकते हैं। एक्सकोड किसी प्रोजेक्ट को स्वचालित रूप से आर्क में अपग्रेड करने का प्रयास कर सकता है।

एआरसी को एलएलवीएम 3.0 में प्रस्तुत किया गया था। यह एक्सकोड 4.2 (2011), या एप्पल एलएलवीएम कंपाइलर 3.0 में अनुवाद करता है।[45]


शाब्दिक

नेक्स्ट और एप्पल ओब्जेस्टसी रनटाइम में लंबे समय से शाब्दिक सिंटैक्स का उपयोग करके नए तार बनाने का एक छोटा-सा विधि सम्मिलित है @"a new string", या कोरफाउंडेशन स्थिरांक पर ड्रॉप करें kcFBooleanTrue और kcFBooleanFalse के लिए NSNumber बूलियन मूल्यों के साथ। इस प्रारूप का उपयोग करने से प्रोग्रामर को अधिक समय तक उपयोग करने से बचाया जाता है initWithString या इसी तरह के विधियों कुछ संचालन करते समय।

एप्पल एलएलवीएम कंपाइलर 4.0 (एक्सकोड 4.4) या बाद के संस्करण का उपयोग करते समय, सरणियाँ, शब्दकोश और संख्याएँ (NSArray, NSDictionary, NSNumber कक्षाएं) विधियों के अतिरिक्त शाब्दिक सिंटैक्स का उपयोग करके भी बनाई जा सकती हैं। <रेफरी नाम = ओब्ज-सी के साथ प्रोग्रामिंग - मान और संग्रह>"ऑब्जेक्टिव-सी के साथ प्रोग्रामिंग: मूल्य और संग्रह". Apple Inc. Archived from the original on September 7, 2011. Retrieved October 8, 2012.</ रेफ> (ऐप्पल एलएलवीएम कंपाइलर 4.0 ओपन सोर्स एलएलवीएम और क्लैंग 3.1 में अनुवाद करता है।) रेफरी नाम = llvm31>"क्लैंग 3.1 रिलीज नोट्स". releases.llvm.org.</रेफरी>

शाब्दिक के बिना उदाहरण:

NSArray *myArray = [NSArray arrayWithObjects:object1,object2,object3,nil];
NSDictionary *myDictionary1 = [NSDictionary dictionaryWithObject:someObject forKey:@"key"];
NSDictionary *myDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:object1, key1, object2, key2, nil];
NSNumber *myNumber = [NSNumber numberWithInt:myInt];
NSNumber *mySumNumber= [NSNumber numberWithInt:(2 + 3)];
NSNumber *myBoolNumber = [NSNumber numberWithBool:YES];

शाब्दिक के साथ उदाहरण:

NSArray *myArray = @[ object1, object2, object3 ];
NSDictionary *myDictionary1 = @{ @"key" : someObject };
NSDictionary *myDictionary2 = @{ key1: object1, key2: object2 };
NSNumber *myNumber = @(myInt);
NSNumber *mySumNumber = @(2+3);
NSNumber *myBoolNumber = @YES;
NSNumber *myIntegerNumber = @8;

चुकीं, स्ट्रिंग शाब्दिक से भिन्न, जो निष्पादन योग्य में स्थिरांक के लिए संकलित होते हैं, ये शाब्दिक उपरोक्त विधि कॉल के समतुल्य कोड के लिए संकलित होते हैं। विशेष रूप से, मैन्युअल रूप से संदर्भ-गणना स्मृति प्रबंधन के अनुसार, इन वस्तुओं को स्वत: रिलीज़ किया जाता है, जिसके लिए अतिरिक्त देखभाल की आवश्यकता होती है, उदाहरण के लिए, फलन-स्थैतिक चर या अन्य प्रकार के ग्लोबल्स के साथ उपयोग किया जाता है।

सब्सक्रिप्शन

एप्पल एलएलवीएम कंपाइलर 4.0 या बाद के संस्करण का उपयोग करते समय, सरणियाँ और शब्दकोश (NSArray और NSDictionary क्लासेस) सबस्क्रिप्टिंग का उपयोग करके हेरफेर किया जा सकता है। वस्तुओं को अनुक्रमणिका या कुंजियों पर सेट करने के लिए। कोड में, कोष्ठकों का उपयोग करके सबस्क्रिप्टिंग का प्रतिनिधित्व किया जाता है [ ].[46]

सबस्क्रिप्टिंग के बिना उदाहरण:

id object1 = [someArray objectAtIndex:0];
id object2 = [someDictionary objectForKey:@"key"];
[someMutableArray replaceObjectAtIndex:0 withObject:object3];
[someMutableDictionary setObject:object4 forKey:@"key"]

सबस्क्रिप्टिंग के साथ उदाहरण:

id object1 = someArray[0];
id object2 = someDictionary[@"key"];
someMutableArray[0] = object3;
someMutableDictionary[@"key"] = object4;

आधुनिक ऑब्जेक्टिव-सी सिंटैक्स (1997)

एप्पल द्वारा नेक्स्ट की खरीद के बाद, स्मॉलटाक की तुलना में जावा (प्रोग्रामिंग भाषा) से अधिक परिचित प्रोग्रामर्स के लिए भाषा को अधिक स्वीकार्य बनाने का प्रयास किया गया। इन प्रयासों में से उस समय का परिचय देना था जिसे उस समय ऑब्जेक्टिव-सी के लिए मॉडर्न सिंटैक्स करार दिया गया था[47] (वर्तमान, क्लासिक सिंटैक्स के विपरीत)। व्यवहार में कोई बदलाव नहीं आया, यह केवल वैकल्पिक वाक्य-विन्यास था। एक विधि सामान्यंत्रण लिखने के अतिरिक्त जैसे

    object = [[MyClass alloc] init];
    [object firstLabel: param1 secondLabel: param2];

इसके अतिरिक्त इसे लिखा गया था

    object = (MyClass.alloc).init;
    object.labels ( param1, param2 );

इसी तरह, घोषणाएं फॉर्म से चली गईं

-(void) firstLabel: (int)param1 secondLabel: (int)param2;

को

 -(void) labels ( int param1, int param2 );

यह आधुनिक सिंटैक्स अब उद्देश्य सी भाषा की वर्तमान बोलियों में समर्थित नहीं है।

मूल-ऑब्जेक्ट

[1] प्रोजेक्ट ऑब्जेक्टिव-सी का एक और री-इम्प्लीमेंटेशन है। यह बैकएंड के रूप में जीएनयू कंपाइलर संग्रह या क्लैंग एलएलवीएम कंपाइलर्स का समर्थन करता है। यह सिंटैक्स, शब्दार्थ और एबीआई संगतता के संदर्भ में अन्य रनटाइम से अलग हो जाता है। यह लिनक्स, फ्रीबीएसडी और विंडोज को सपोर्ट करता है।

पोर्टेबल ऑब्जेक्ट कंपाइलर

जीएनयू कंपाइलर कलेक्शन नेक्स्ट एप्पल इंक. कार्यान्वयन के अतिरिक्त, जिसने मूल स्टेपस्टोन कार्यान्वयन में कई एक्सटेंशन जोड़े, एक और फ्री और ओपन सोर्स सॉफ्टवेयर | फ्री, ओपन-सोर्स ऑब्जेक्टिव-सी कार्यान्वयन जिसे पोर्टेबल ऑब्जेक्ट कंपाइलर कहा जाता है, भी उपस्थित है।[48] पोर्टेबल ऑब्जेक्ट कंपाइलर द्वारा प्रयुक्त किए गए एक्सटेंशन का सेट जीसीसी नेक्स्ट एप्पल कार्यान्वयन से अलग है; विशेष रूप से, इसमें ऑब्जेक्टिव-सी के लिए स्मॉलटाक जैसे ब्लॉक सम्मिलित हैं, जबकि इसमें प्रोटोकॉल और श्रेणियों की कमी है, ओपनस्टेप और इसके डेरिवेटिव और रिश्तेदार में बड़े पैमाने पर उपयोग की जाने वाली दो विशेषताएं। कुल मिलाकर, पीओसी भाषा के विकास में पुराने, पूर्व-नेक्स्ट चरण का प्रतिनिधित्व करता है, जो सामान्य तौर पर ब्रैड कॉक्स की 1991 की किताब के अनुरूप है।

इसमें ऑब्जेक्टपैक नामक रनटाइम लाइब्रेरी भी सम्मिलित है, जो कॉक्स की मूल आईसी पाक101 लाइब्रेरी पर आधारित है (जो बदले में स्मॉलटाक -80 क्लास लाइब्रेरी से प्राप्त होती है), और ओपनस्टेप फाउंडेशनकिट से काफी अलग है।

जीईओएस उद्देश्य-सी

जीईओएस (16-बिट ऑपरेटिंग प्रणाली) प्रणाली प्रोग्रामिंग भाषा का उपयोग करता है जिसे जीईओएस उद्देश्य सी या जीईओ के रूप में जाना जाता है;[49] नाम की समानता के अतिरिक्त, दो भाषाएँ केवल समग्र अवधारणा में समान हैं और @ चिन्ह के साथ उपसर्ग वाले कीवर्ड का उपयोग करती हैं।

बजना

क्लैंग कंपाइलर सूट, एलएलवीएम प्रोजेक्ट का भाग, ऑब्जेक्टिव-सी और अन्य भाषाओं को प्रयुक्त करता है। जीसीसी 4.3 (2008) के जीपीएलवी3 में बदलने के बाद, एप्पल ने क्लैंग के पक्ष में इसे छोड़ दिया, कंपाइलर जिसके पास संशोधित करने के लिए अधिक कानूनी शक्ति है। परिणामस्वरुप , आधुनिक ऑब्जेक्टिव-सी भाषा की कई विशेषताएं केवल क्लैंग द्वारा समर्थित हैं।

अपने क्लैंग-आधारित एलएलवीएम कंपाइलर के लिए ऐप्पल की वर्जनिंग स्कीम एलएलवीएम के ओपन-सोर्स वर्जनिंग से अलग है। देखना एक्सकोड § टूलचैन संस्करण अनुवाद के लिए[43]


जीएनयू, जीएनयूस्टेप, और विनओबीजेसी

जीएनयू प्रोजेक्ट, लंबे समय से, नेक्स्ट और ऑब्जेक्टसी प्रोग्राम को पोर्ट करने के लिए प्लेटफॉर्म में रुचि रखता है। के लिए चेंजलॉग लीबॉबजेसी जीसीसी में निर्देशिका से पता चलता है कि यह 1998 (जीसीसी 2.95) से पहले अस्तित्व में था, और इसके रीडमे ने 1993 (जीसीसी 2.4) में एक पुनर्लेखन पर आगे संकेत किया।[50]

नेक्स्ट फ्रंटएंड सोर्स कोड जारी किया गया था क्योंकि इसे जीसीसी के भागों के रूप में बनाया गया था, जीएनयू पब्लिक लाइसेंस जारी किया गया था जो ऐसा करने के लिए व्युत्पन्न कार्यों को करने के लिए मजबूर करता है। एप्पल ने 4.2.1 तक जीसीसी के अपने फोर्क को जारी करने में इस परंपरा को जारी रखा, जिसके बाद उन्होंने कंपाइलर को छोड़ दिया। जीसीसी अनुरक्षकों ने परिवर्तनों को स्वीकार किया, लेकिन ऑब्जेक्टिव-सी 2.0 भाषा जैसी नई सुविधाओं का समर्थन करने में ज्यादा निवेश नहीं किया।[32]

नई भाषा में रुचि रखने वाले जीएनयूस्टेप डेवलपर्स ने जीसीसी को फोर्क किया लीबॉबजेसी जीसीसी से स्वतंत्र परियोजना के लिए कहा जाता है लीबॉबजेसी2 2009 में। उन्होंने नई भाषा सिंटैक्स का लाभ उठाने के लिए क्लैंग के साथ रनटाइम के उपयोग की भी व्यवस्था की।[32] जीसीसी एक ही समय में धीरे-धीरे चला गया, लेकिन जीसीसी 4.6.0 (2011) में वे ऑब्जेक्टिव-सी 2.0 पर अपने लीबॉबजेसी में भी चले गए हैं।[31][51] जीएनयूस्टेप प्रलेखन सुझाव देता है कि जीसीसी कार्यान्वयन में अभी भी ब्लॉक, गैर-नाजुक चर और नए एआरसी के लिए समर्थन की कमी है।[32]

माइक्रोसॉफ्ट कांटा लीबॉबजेसी2 2015 में विंडोऑब्जेक्टसी के भागों में, यूनिवर्सल विंडोज प्लेटफॉर्म के लिए आईओएस ब्रिज। कोको टच और अंतर्निहित एपीआई के अपने स्वयं के कार्यान्वयन के साथ संयुक्त, परियोजना यूडब्ल्यूपी ऐप्स के अंदर आईओएस एप्लिकेशन कोड के पुन: उपयोग की अनुमति देती है।[52]

विंडोज़ पर, उद्देश्य-सी विकास उपकरण जीएनयूस्टेप की वेबसाइट पर डाउनलोड करने के लिए प्रदान किए जाते हैं। जीएनयू स्टेप डेवलपमेंट प्रणाली में निम्नलिखित पैकेज होते हैं: जीएनयू स्टेप मिनजीडब्ल्यू प्रणाली, जीएनयू स्टेप कोर, जीएनयू स्टेप डिवेल, जीएनयू स्टेप करियो, परियोजना केंद्र आईडीई (एक्सकोड की तरह, लेकिन उतना जटिल नहीं), गोर्म (इंटरफ़ेस बिल्डर लाइक एक्सकोड एनआईबी बिल्डर)। ये बाइनरी इंस्टॉलर 2016 से अपडेट नहीं किए गए हैं,[53] इसलिए इसके अतिरिक्त साइगविन या एमएसवाईएस2 के अनुसार निर्माण करके स्थापित करना अच्छा विचार हो सकता है।

लाइब्रेरी का उपयोग

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

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

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

भाषा का विश्लेषण

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

इसी तरह, भाषा को वर्त्तमान सी कंपाइलर्स (जीएनयू कंपाइलर संग्रह में, पहले प्रीप्रोसेसर के रूप में, फिर मॉड्यूल के रूप में) के अतिरिक्त नए कंपाइलर के रूप में प्रयुक्त किया जा सकता है। यह ऑब्जेक्टिव-सी को सी कोड, लाइब्रेरी, उपकरण्स आदि के विशाल वर्त्तमान संग्रह का लाभ उठाने की अनुमति देता है। वर्त्तमान सी लाइब्रेरी को ओओ-स्टाइल इंटरफ़ेस प्रदान करने के लिए ऑब्जेक्टिव-सी एडेप्टर पैटर्न में लपेटा जा सकता है। इस पहलू में, यह गोऑब्जेक्ट लाइब्रेरी और वाला (प्रोग्रामिंग भाषा) भाषा के समान है, जो जीटीके अनुप्रयोगों के विकास में व्यापक रूप से उपयोग की जाती हैं।

इन सभी व्यावहारिक परिवर्तनों ने प्रवेश की बाधाओं को कम कर दिया, संभवतः 1980 के दशक में स्मॉलटाक की व्यापक स्वीकृति के लिए सबसे बड़ी समस्या।

सामान्य आलोचना यह है कि ऑब्जेक्टिव-सी में नाम स्थान के लिए भाषा समर्थन नहीं है। इसके अतिरिक्त, प्रोग्रामर को अपने वर्ग के नामों में उपसर्ग जोड़ने के लिए मजबूर किया जाता है, जो परंपरागत रूप से नाम स्थान के नाम से कम होते हैं और इस प्रकार टकराव के लिए अधिक प्रवण होते हैं। 2007 तक, कोको (सॉफ्टवेयर) प्रोग्रामिंग वातावरण में सभी मैक ओएस कक्षाएं और फलन एन एस (जैसे एनएसओब्जेक्ट, एनएसबटन) के साथ प्रीफ़िक्स्ड हैं ताकि उन्हें मैक ओएस या आईओएस कोर से संबंधित के रूप में पहचाना जा सके; एन एस, नेक्स्टस्टेप के विकास के समय परिभाषित किए गए वर्गों के नामों से निकला है।

चूँकि उद्देश्य सी, सी का सख्त सुपरसेट है, यह सी आदिम प्रकारों को प्रथम श्रेणी की वस्तुओं के रूप में नहीं मानता है।

सी ++ के विपरीत, ऑब्जेक्टिव-सी ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है। सी ++ के विपरीत, ऑब्जेक्टिव-सी किसी ऑब्जेक्ट को सीधे केवल वर्ग से प्राप्त करने की अनुमति देता है (एकाधिक विरासत को रोकता है)। चुकी, अधिकांशतः स्थितियों में, समान परिणाम प्राप्त करने के वैकल्पिक विधियों के रूप में श्रेणियों और प्रोटोकॉल का उपयोग किया जा सकता है।

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

स्मृति प्रबंधन

ऑब्जेक्टिव-सी के पहले संस्करण कचरा संग्रह (कंप्यूटर विज्ञान) का समर्थन नहीं करते थे। उस समय यह निर्णय कुछ बहस का विषय था, और कई लोगों ने पूरे प्रणाली को अनुपयोगी बनाने के लिए लंबे डेड टाइम (जब स्मॉलटाक ने संग्रह का प्रदर्शन किया) माना। कुछ तीसरे पक्ष के कार्यान्वयन ने इस सुविधा को जोड़ा है (सबसे विशेष रूप से बोहम कचरा संग्राहक का उपयोग करके जीएनयूस्टेप), और एप्पल ने इसे मैक ओएस एक्स वी10.5 के रूप में प्रयुक्त किया है।[54] चुकीं, मैक ओएस और आईओएस के अधिक हाल के संस्करणों में, कचरा संग्रह को 2011 में प्रारंभ की गई स्वचालित संदर्भ गणना (एआरसी) के पक्ष में बहिष्कृत कर दिया गया है।

एआरसी के साथ, कंपाइलर आवेषण स्टेटिक प्रोग्राम विश्लेषण के आधार पर स्वचालित रूप से ऑब्जेक्टिव-सी कोड में कॉल को बनाए रखता है और जारी करता है। स्वचालन प्रोग्रामर को स्मृति प्रबंधन कोड में लिखने से राहत देता है। एआरसी ऑब्जेक्टिव-सी भाषा में कमजोर संदर्भ भी जोड़ता है।[55]


ऑब्जेक्टिव-सी और सी++ के बीच दार्शनिक अंतर

सी ++ और ऑब्जेक्टिव-सी का डिज़ाइन और कार्यान्वयन सी को विस्तारित करने के लिए मौलिक रूप से अलग-अलग दृष्टिकोणों का प्रतिनिधित्व करता है।

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

उल्लेखनीय अंतर यह है कि ऑब्जेक्टिव-सी रिफ्लेक्शन (कंप्यूटर साइंस) सुविधाओं के लिए रनटाइम सहायता प्रदान करता है, जबकि सी ++ सी में केवल थोड़ी मात्रा में रनटाइम सपोर्ट जोड़ता है। ऑब्जेक्टिव-सी में, किसी ऑब्जेक्ट को अपने स्वयं के गुणों के बारे में पूछा जा सकता है, जैसे, यह निश्चित संदेश का उत्तर देगा। सी ++ में, बाहरी पुस्तकालयों के उपयोग के बिना यह संभव नहीं है।

प्रतिबिंब का उपयोग भाषा की गतिशील (रन-टाइम) सुविधाओं और स्थिर (संकलन-समय) सुविधाओं के बीच व्यापक अंतर का भाग है। चुकी ऑब्जेक्टिव-सी और सी ++ प्रत्येक दोनों सुविधाओं के मिश्रण को नियोजित करते हैं, ऑब्जेक्टिव-सी निश्चित रूप से रन-टाइम निर्णयों के लिए तैयार है जबकि सी ++ संकलन-समय के निर्णयों के लिए तैयार है। डायनेमिक और स्टैटिक प्रोग्रामिंग के बीच तनाव में प्रोग्रामिंग में कई क्लासिक ट्रेड-ऑफ सम्मिलित हैं: डायनेमिक विशेषता्स में लचीलापन आता है, स्टैटिक विशेषता्स में गति और टाइप चेकिंग सम्मिलित होती है।

रनटाइम बहुरूपता का उपयोग करके दोनों भाषाओं में सामान्य प्रोग्रामिंग और मेटाप्रोग्रामिंग को प्रयुक्त किया जा सकता है। सी ++ में यह आभासी कार्यों और रनटाइम प्रकार की पहचान का रूप लेता है, जबकि ऑब्जेक्टिव-सी गतिशील टाइपिंग और प्रतिबिंब प्रदान करता है। उद्देश्य-सी और सी ++ दोनों संकलन-समय बहुरूपता (सामान्य कार्यों) का समर्थन करते हैं, उद्देश्य-सी केवल 2015 में इस सुविधा को जोड़ रहा है।

यह भी देखें

  • सी (प्रोग्रामिंग भाषा)
  • सी ++
  • प्रोग्रामिंग भाषाओं की तुलना
  • IBM प्रणाली ऑब्जेक्ट मॉडल# संकलित क्लास लाइब्रेरी के लिए समर्थन की तुलना|सीOM, GObject, SOM, Windows रनटाइम, XPसीOM के साथ तुलना
  • स्विफ्ट (प्रोग्रामिंग भाषा)
  • एक्सकोड
  • WinObjसी (उर्फ: आईओएस के लिए विंडोज ब्रिज)

संदर्भ

  1. "Runtime Versions and Platforms". Developer.apple.com. Archived from the original on July 20, 2016. Retrieved December 24, 2017.
  2. Lattner, Chris (June 3, 2014). "Chris Lattner's Homepage". Chris Lattner. Archived from the original on June 4, 2014. Retrieved June 3, 2014. The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
  3. 3.0 3.1 "App Frameworks". Apple. June 2014. Archived from the original on February 16, 2019. Retrieved February 13, 2019.
  4. Singh, Amit (December 2003). "A Brief History of Mac OS X". Mac OS X Internals. Archived from the original on May 14, 2012. Retrieved June 11, 2012.
  5. Garling, Caleb. "iPhone Coding Language Now World's Third Most Popular". Wired. Archived from the original on September 9, 2013. Retrieved May 20, 2013.
  6. Wentk, Richard (2009). Cocoa: Volume 5 of Developer Reference Apple Developer Series. John Wiley and Sons. ISBN 978-0-470-49589-6. Archived from the original on February 16, 2017. Retrieved July 22, 2016.
  7. Biancuzzi, Federico; Warden, Shane (2009). Masterminds of Programming. O'Reilly Media, Inc. pp. 242–246. ISBN 978-0-596-51517-1. Archived from the original on February 17, 2017. Retrieved July 22, 2016.
  8. Cox, Brad (1983). "The object oriented pre-compiler: programming Smalltalk 80 methods in C language". ACM SIGPLAN Notices. New York, NY: ACM. 18 (1). doi:10.1145/948093.948095. S2CID 6975032. Retrieved February 17, 2011.
  9. "Common Lisp and Readline". GitHub. Archived from the original on September 6, 2014. Retrieved September 15, 2014. The issue first arose when NeXT proposed to distribute a modified GCC in two parts and let the user link them. Jobs asked me whether this was lawful. It seemed to me at the time that it was, following reasoning like what you are using; but since the result was very undesirable for free software, I said I would have to ask the lawyer. What the lawyer said surprised me; he said that judges would consider such schemes to be "subterfuges" and would be very harsh toward them. He said a judge would ask whether it is "really" one program, rather than how it is labeled. So I went back to Jobs and said we believed his plan was not allowed by the GPL. The direct result of this is that we now have an Objective C front end. They had wanted to distribute the Objective C parser as a separate proprietary package to link with the GCC back end, but since I didn't agree this was allowed, they made it free.
  10. "GNUstep: Introduction". GNUstep developers/GNU Project. Archived from the original on August 6, 2012. Retrieved July 29, 2012.
  11. "Kresten Krab Thorup | LinkedIn". www.linkedin.com. Archived from the original on July 15, 2014. Retrieved June 23, 2016.
  12. "Write Objective-C Code". apple.com. April 23, 2013. Archived from the original on December 24, 2013. Retrieved December 22, 2013.
  13. "Objective-C Boot Camp". Archived from the original on February 11, 2018. Retrieved February 11, 2018. Objective-C is a strict superset of ANSI C
  14. "Examining Objective-C". Archived from the original on September 4, 2014. Retrieved September 4, 2014. Objective-C is an object-oriented strict superset of C
  15. Lee, Keith (September 3, 2013). Pro Objective-C. Apress. ISBN 9781430250500. Archived from the original on May 14, 2018. Retrieved December 24, 2017 – via Google Books.
  16. "Tags for Objective-C Headers". Archived from the original on April 1, 2017. Retrieved February 11, 2018. Objective-C is a superset of C
  17. "AppScan Source 8.7 now available". Archived from the original on February 3, 2017. Retrieved February 11, 2018. The Objective-C programming language is a superset of the C programming language
  18. Apple, Inc. (October 19, 2009). "Dynamic Method Resolution". Objective-C Runtime Programming Guide. Archived from the original on September 7, 2010. Retrieved November 25, 2014.
  19. Apple, Inc. (October 19, 2009). "Avoiding Messaging Errors". The Objective-C Programming Language. Archived from the original on September 8, 2010.
  20. "objc_msgSend - Objective-C Runtime". Apple Developer Documentation. Retrieved 10 February 2020.
  21. "Messaging with the GNU Objective-C runtime". Using the GNU Compiler Collection (GCC). Retrieved 10 February 2020.
  22. "Category". Apple Developer (Cocoa Core Competencies).
  23. Dalrymple, Mark; Knaster, Scott (June 27, 2012). Learn Objective-C on the Mac. p. 9. ISBN 9781430241881. The .m extension originally stood for "messages" when Objective-C was first introduced, referring to a central feature of Objective-C
  24. "Objective-C Runtime Programming Guide". Apple Inc. Archived from the original on April 4, 2014. Retrieved October 21, 2013.
  25. "ACM SIGGRAPH 1983 Issue 8 - Smalltalk". Archived from the original on 15 April 2009. Retrieved 7 October 2008.
  26. "Extension Methods (C# Programming Guide)". Microsoft. October 2010. Archived from the original on July 11, 2011. Retrieved July 10, 2011.
  27. "Using C++ With Objective-C". Mac OS X Reference Library. Archived from the original on September 5, 2010. Retrieved February 10, 2010.
  28. "Clang Language Extensions — Clang 3.5 documentation". Clang.llvm.org. Archived from the original on February 24, 2014. Retrieved April 16, 2014.
  29. "Objective-C 2.0: more clues". Lists.apple.com. August 10, 2006. Archived from the original on June 18, 2009. Retrieved May 30, 2010.
  30. "Re: Objective-C 2.0". Lists.apple.com. Archived from the original on November 24, 2010. Retrieved May 30, 2010.
  31. 31.0 31.1 "GCC 4.6 Release Series — Changes, New Features, and Fixes : GNU Project : Free Software Foundation". Gcc.gnu.org. Archived from the original on January 5, 2018. Retrieved December 24, 2017.
  32. 32.0 32.1 32.2 32.3 "ObjC2 FAQ". GNUstep. Retrieved 6 January 2020.
  33. "Source Browser: objc4, 756.2". Apple Open Source. Retrieved 6 January 2020.
  34. Garbage Collection Programming Guide: Garbage Collection API Archived June 9, 2012, at the Wayback Machine (Apple developer website - search for "__strong")
  35. "Garbage Collection Programming Guide: Introduction to Garbage Collection". Apple Inc. October 3, 2011. Archived from the original on June 9, 2012. Retrieved December 23, 2011.
  36. "Leopard Technology Series for Developers: Objective-C 2.0 Overview". Apple Inc. November 6, 2007. Archived from the original on July 24, 2010. Retrieved May 30, 2010.
  37. "Transitioning to ARC Release Notes". Apple Inc. July 17, 2012. Archived from the original on June 9, 2012. Retrieved August 26, 2012.
  38. Mike Ash. "Friday Q&A 2013-09-27: ARM64 and You". mikeash.com. Archived from the original on April 26, 2014. Retrieved April 27, 2014.
  39. "Hamster Emporium: [objc explain]: Non-pointer isa". Sealiesoftware.com. September 24, 2013. Archived from the original on June 3, 2014. Retrieved April 27, 2014.
  40. Apple, Inc. (2009). "Fast Enumeration". apple.com. Archived from the original on December 17, 2009. Retrieved December 31, 2009.
  41. Free Software Foundation, Inc. (2011). "GCC 4.6 Release Series – Changes, New Features, and Fixes". Gcc.gnu.org. Archived from the original on December 2, 2013. Retrieved November 27, 2013.
  42. "Blocks Programming Topics – Mac Developer Library". Apple Inc. March 8, 2011. Archived from the original on June 9, 2012. Retrieved November 28, 2012.
  43. 43.0 43.1 "Objective-C Automatic Reference Counting (ARC) — Clang 11 documentation". Clang documentation. Retrieved 20 February 2020. For now, it is sensible to version this document by the releases of its sole implementation (and its host project), clang. "LLVM X.Y" refers to an open-source release of clang from the LLVM project. "Apple X.Y" refers to an Apple-provided release of the Apple LLVM Compiler.
  44. "Transitioning to ARC". Apple Inc. Archived from the original on September 7, 2011. Retrieved October 8, 2012.
  45. "LLVM 3.0 Release Notes". releases.llvm.org.
  46. "Objective-C Literals — Clang 3.5 documentation". Clang.llvm.org. Archived from the original on June 6, 2014. Retrieved April 16, 2014.
  47. Rhapsody Developer's Guide, AP Professional, 1997, pp. 76–84
  48. "Portable Object Compiler". Users.pandora.be. January 1, 1970. Archived from the original on August 2, 2008. Retrieved May 30, 2010.
  49. "Breadbox Computer Company LLC homepage". Archived from the original on July 27, 2011. Retrieved December 8, 2010.
  50. "gcc/libobjc". GitHub. gcc-mirror. 6 January 2020. Retrieved 6 January 2020. he runtime has been completely rewritten in gcc 2.4. The earlier runtime had several severe bugs and was rather incomplete.
  51. "GNU Objective-C runtime API". Using GCC. Retrieved 6 January 2020.
  52. "WinObjC on GitHub". GitHub. Archived from the original on December 2, 2017. Retrieved February 13, 2018.
  53. "GNUStep Installer". Archived from the original on February 17, 2018. Retrieved February 14, 2018.
  54. Apple, Inc. (August 22, 2006). "Mac OS X Leopard – Xcode 3.0". apple.com. Archived from the original on October 24, 2007. Retrieved August 22, 2006.
  55. "Transitioning to ARC Release Notes". iOS Developer Library. Developer.apple.com. Archived from the original on September 7, 2011. Retrieved April 16, 2014.

अग्रिम पठन

  • Cox, Brad J. (1991). Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.

बाहरी संबंध