ऑब्जेक्टिव-सी

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

उद्देश्य-सी स्रोत कोड 'मैसेजिंग/कार्यान्वयन' प्रोग्राम फ़ाइलें आमतौर पर होती हैं .m फ़ाइल नाम एक्सटेंशन, जबकि ऑब्जेक्टिव-सी 'हेडर/इंटरफ़ेस' फ़ाइलें हैं .h एक्सटेंशन, सी हेडर फाइलों के समान। ऑब्जेक्टिव-सी++ फाइलों को a से निरूपित किया जाता है .mm फाइल एक्सटेंशन।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

एक इंटरफ़ेस घोषणा प्रपत्र लेती है: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @इंटरफेस क्लासनाम: सुपरक्लासनाम { // आवृत्ति के चर } + क्लासमेथोड 1; + (रिटर्न_टाइप) क्लासमेथोड 2; + (वापसी_ प्रकार) वर्ग विधि 3: (परम 1_ प्रकार) परम 1_वरनाम;

- (वापसी_प्रकार) उदाहरण विधि 1 एक पैरामीटर के साथ: (param1_type) param1_varName; - (वापसी_प्रकार) उदाहरण विधि 2 विथ 2 पैरामीटर: (परम 1_ प्रकार) परम 1_varName param2_callName: (param2_type) param2_varName; @अंत 

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

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

<वाक्यविन्यास लैंग = सीपीपी> क्लास क्लासनाम: पब्लिक सुपरक्लासनाम { संरक्षित: // आवृत्ति के चर

जनता: // कक्षा (स्थैतिक) कार्य स्थैतिक शून्य * वर्ग विधि 1 ; स्थिर रिटर्न_टाइप क्लासमेथोड 2 ; स्थिर रिटर्न_टाइप क्लासमेथोड 3 (परम 1_टाइप पैराम 1_varName);

// उदाहरण (सदस्य) कार्य करता है रिटर्न_टाइप इंस्टेंसमेथोड 1 विथ 1 पैरामीटर (पैरा 1_टाइप पैराम 1_varName); वापसी प्रकार उदाहरण मेथोड2 विथ 2 पैरामीटर (पैरा 1_टाइप पैराम 1_वरनाम,                                param2_type param2_varName = डिफ़ॉल्ट); }; 

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) सेटरेंज स्टार्ट: (इंट) स्टार्ट एंड: (इंट) एंड; - (शून्य) आयात दस्तावेज़ विथनाम: (एनएसएसटींग *) नाम withSpecifiedPreferences:(Preferences *)prefs पृष्ठ से पहले: (int) सम्मिलित करें पृष्ठ; 

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

कार्यान्वयन
इंटरफ़ेस केवल क्लास इंटरफ़ेस की घोषणा करता है न कि स्वयं विधियों की: वास्तविक कोड कार्यान्वयन फ़ाइल में लिखा गया है। कार्यान्वयन (विधि) फ़ाइलों में सामान्य रूप से फ़ाइल एक्सटेंशन होता है, जो मूल रूप से संदेशों को दर्शाता था। <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @कार्यान्वयन वर्गनाम + (वापसी_ प्रकार) वर्ग विधि { // कार्यान्वयन } - (वापसी_प्रकार) उदाहरण विधि { // कार्यान्वयन } @अंत 

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (इंट) विधि: (इंट) मैं { वापसी [स्व वर्ग_रोट: मैं]; } 

<वाक्यविन्यास प्रकाश लैंग = सी> इंट फंक्शन (इंट आई) { वापसी वर्ग_रूट (i); } 

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) रंग बदलने के लिए लाल: (फ्लोट) लाल हरा: (फ्लोट) हरा नीला: (फ्लोट) नीला { //... कार्यान्वयन ... }

// इस तरह कहा जाता है: [myColor changeColorToRed:5.0 हरा:2.0 नीला:6.0]; 

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

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

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

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

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> MyObject *foo = [MyObject ऑब्जेक्ट]; MyObject *bar = [MyObject objectWithString:@ विकिपीडिया :)]; 

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

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

<वाक्यविन्यास लैंग = ओबीजेसी लाइन> - (आईडी) init { स्व = [सुपर इनिट]; अगर (स्वयं) { // यहाँ वस्तु का आरंभीकरण करें }   स्वयं लौटें; } 

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

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


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

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

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

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

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

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

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

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

वाक्य रचना

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @protocol एनएसएलॉकिंग - (शून्य) ताला; - (शून्य) अनलॉक; @अंत 

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @interface NSLock: NSObject  // ... @अंत 

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) सेट मायवैल्यू: (आईडी) फू;  उपरोक्त कथन में फू किसी भी वर्ग का हो सकता है।

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) सेट मायवैल्यू: (एनएसनंबर *) फू;  उपरोक्त बयान में, फू NSNumber वर्ग का एक उदाहरण होना चाहिए।

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

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

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

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

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

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

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

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

@इंटरफेस फॉरवर्डर: ऑब्जेक्ट { आईडी प्राप्तकर्ता; // जिस वस्तु को हम संदेश को अग्रेषित करना चाहते हैं। }

// एक्सेसर के तरीके। - (आईडी) प्राप्तकर्ता; - (आईडी) सेट प्राप्तकर्ता: (आईडी) _ प्राप्तकर्ता; @अंत </वाक्यविन्यास हाइलाइट>

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
 * फारवर्डर.एम
 * 1) आयात फारवर्डर.एच

@कार्यान्वयन फारवर्डर - (retval_t) आगे: (SEL) sel args: (arglist_t) args { /* * जांचें कि प्राप्तकर्ता वास्तव में संदेश का जवाब देता है या नहीं। * यह वांछनीय हो सकता है या नहीं भी हो सकता है, उदाहरण के लिए, यदि कोई प्राप्तकर्ता * बदले में संदेश का जवाब नहीं देता है, यह अग्रेषण कर सकता है * अपने आप। */ अगर ([प्राप्तकर्ता ने चयनकर्ता को जवाब दिया: सेल]) { वापसी [प्राप्तकर्ता प्रदर्शन: एसईएल तर्क: तर्क]; } अन्य { वापसी [स्वयं त्रुटि: प्राप्तकर्ता जवाब नहीं देता]; } }

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

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

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

// एक साधारण प्राप्तकर्ता वस्तु। @ इंटरफेस प्राप्तकर्ता: ऑब्जेक्ट - (आईडी) हैलो; @अंत </वाक्यविन्यास हाइलाइट>

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
 * प्राप्तकर्ता.एम
 * 1) आयात प्राप्तकर्ता.एच

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

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
 * मुख्य.एम
 * 1) आयात फारवर्डर.एच
 * 2) आयात प्राप्तकर्ता.एच

पूर्णांक मुख्य (शून्य) { फारवर्डर * फारवर्डर = [फॉरवर्डर नया]; प्राप्तकर्ता * प्राप्तकर्ता = [नया प्राप्तकर्ता];

[फारवर्डर सेट प्राप्तकर्ता: प्राप्तकर्ता]; // प्राप्तकर्ता सेट करें। /* * निरीक्षण करें कि फारवर्डर एक हैलो संदेश का जवाब नहीं देता है! यह *अग्रेषित करें। सभी गैर-मान्यता प्राप्त विधियों को अग्रेषित किया जाएगा * प्राप्तकर्ता * (यदि प्राप्तकर्ता उन्हें जवाब देता है, जैसा कि फारवर्डर में लिखा गया है) */ [फारवर्डर हैलो];

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

वापसी 0; } </वाक्यविन्यास हाइलाइट>

टिप्पणियाँ
When compiled using gcc, the compiler reports:

The compiler is reporting the point made earlier, that 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:

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

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

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

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

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

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

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


 * पूर्णांक। एच
 * <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>


 * 1) आयात <objc/Object.h>

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

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


 * पूर्णांक.एम
 * <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>


 * 1) आयात पूर्णांक.एच

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

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


 * पूर्णांक+अंकगणित.एच
 * <वाक्यविन्यास लैंग = ओबीजेसी>


 * 1) आयात पूर्णांक.एच

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


 * पूर्णांक+अंकगणित.m
 * <वाक्यविन्यास लैंग = ओबीजेसी>


 * 1) आयात पूर्णांक+अंकगणित.एच

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

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


 * पूर्णांक+डिस्प्ले.एच
 * <वाक्यविन्यास लैंग = ओबीजेसी>


 * 1) आयात पूर्णांक.एच

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


 * पूर्णांक+डिस्प्ले.एम
 * <वाक्यविन्यास लैंग = ओबीजेसी>


 * 1) आयात पूर्णांक + प्रदर्शन। एच

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

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

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

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


 * मुख्य.एम
 * <वाक्यविन्यास लैंग = ओबीजेसी लाइन>


 * 1) आयात पूर्णांक.एच
 * 2) आयात पूर्णांक+अंकगणित.एच
 * 3) आयात पूर्णांक+प्रदर्शन.एच

पूर्णांक मुख्य (शून्य) { पूर्णांक * अंक 1 = [पूर्णांक नया], * अंक 2 = [पूर्णांक नया]; इंट एक्स;

प्रिंटफ (एक पूर्णांक दर्ज करें:); स्कैनफ (% डी, & एक्स);

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

प्रिंटफ (एक पूर्णांक दर्ज करें:); स्कैनफ (% डी, & एक्स);

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

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

वापसी 0; } </वाक्यविन्यास हाइलाइट>

टिप्पणियाँ
Compilation is performed, for example, by:

One can experiment by leaving out the #import "Integer+Arithmetic.h" (line 2) and [num1 add:num2] (line 21) and omitting 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.

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

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

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @ इंटरफेस कस्टमएनएसएप्लीकेशन: एनएसएप्लीकेशन @अंत

@कार्यान्वयन CustomNSAplication - (शून्य) सेटमेनमेनू: (एनएसमेनू*) मेनू { // मेनू के साथ कुछ करें } @अंत

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

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

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

लिनक्स जीसीसी संकलन
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // फ़ाइल: हैलो.एम int main (int argc, const char * argv[]) {   /* ऑब्जेक्टिव-सी में मेरा पहला प्रोग्राम */ एनएसएलओजी (@ हैलो, वर्ल्ड! \n); वापसी 0; }
 * 1) आयात <फाउंडेशन/फाउंडेशन.एच>

</वाक्यविन्यास हाइलाइट>

<वाक्यविन्यास लैंग = शेल-सत्र> $ # gcc और MinGW कंपाइलर के लिए कंपाइल कमांड लाइन: $ जीसीसी \ $(gnusstep-config --objc-flags) \ -ओ हैलो \ हेलो.एम \ -एल /जीएनयूस्टेप/सिस्टम/लाइब्रेरी/लाइब्रेरी \ -लोबजेसी \ -lgnustep-आधार

$ ./नमस्ते </वाक्यविन्यास हाइलाइट>

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

उद्देश्य-सी ++
Objective-C++ GNU Compiler Collection और Clang के फ्रंट-एंड द्वारा स्वीकार किया गया एक भाषा संस्करण है, जो C++ और Objective-C सिंटैक्स के संयोजन का उपयोग करने वाली स्रोत फ़ाइलों को संकलित कर सकता है। ऑब्जेक्टिव-सी++ सी++ में वे एक्सटेंशन जोड़ता है जो ऑब्जेक्टिव-सी सी में जोड़ता है। जैसा कि विभिन्न भाषा सुविधाओं के पीछे शब्दार्थ को एकीकृत करने के लिए कुछ भी नहीं किया जाता है, कुछ प्रतिबंध लागू होते हैं:
 * एक सी ++ क्लास ऑब्जेक्टिव-सी क्लास से प्राप्त नहीं हो सकती है और इसके विपरीत।
 * सी ++ नेमस्पेस को उद्देश्य-सी घोषणा के अंदर घोषित नहीं किया जा सकता है।
 * उद्देश्य-सी घोषणाएं केवल वैश्विक दायरे में दिखाई दे सकती हैं, सी ++ नेमस्पेस के अंदर नहीं
 * उद्देश्य-सी कक्षाओं में सी ++ कक्षाओं के आवृत्ति चर नहीं हो सकते हैं जिनमें डिफ़ॉल्ट कंस्ट्रक्टर की कमी है या जिनमें एक या अधिक वर्चुअल विधियां हैं, लेकिन सी ++ ऑब्जेक्ट्स के पॉइंटर्स को प्रतिबंध के बिना उदाहरण चर के रूप में उपयोग किया जा सकता है (उन्हें -इनिट विधि में नए के साथ आवंटित करें)।
 * C++ by value semantics को Objective-C ऑब्जेक्ट्स पर लागू नहीं किया जा सकता है, जो केवल पॉइंटर्स के माध्यम से एक्सेस किए जा सकते हैं।
 * एक उद्देश्य-सी घोषणा सी ++ टेम्पलेट घोषणा के भीतर नहीं हो सकती है और इसके विपरीत। हालांकि, ऑब्जेक्टिव-सी टाइप (जैसे, Classname *) का उपयोग C++ टेम्पलेट पैरामीटर के रूप में किया जा सकता है।
 * ऑब्जेक्टिव-सी और सी++ एक्सेप्शन हैंडलिंग अलग है; प्रत्येक के संचालक दूसरे प्रकार के अपवादों को संभाल नहीं सकते। नतीजतन, वस्तु विनाशक नहीं चलाए जाते हैं। हाल के ऑब्जेक्टिव-सी 2.0 रनटाइम में इसे कम किया गया है क्योंकि ऑब्जेक्टिव-सी अपवादों को या तो पूरी तरह से (ऐप्पल रनटाइम) सी ++ अपवादों द्वारा प्रतिस्थापित किया जाता है, या आंशिक रूप से जब ऑब्जेक्टिव-सी ++ लाइब्रेरी जुड़ा हुआ है (जीएनयूस्टेप libobjc2)।
 * ऑब्जेक्टिव-सी ब्लॉक और C++11 बेनामी फंक्शन#C++ (C++11 के बाद से) अलग-अलग संस्थाएं हैं। हालाँकि, एक लैम्ब्डा पास करते समय macOS पर एक ब्लॉक पारदर्शी रूप से उत्पन्न होता है जहाँ एक ब्लॉक की उम्मीद होती है।

उद्देश्य-सी 2.0
2006 के विश्वव्यापी डेवलपर्स सम्मेलन में, Apple ने Objective-C 2.0 को जारी करने की घोषणा की, Objective-C भाषा का एक संशोधन जिसमें आधुनिक कचरा संग्रह, सिंटैक्स संवर्द्धन, रनटाइम प्रदर्शन में सुधार, और 64-बिट समर्थन। Mac OS X v10.5, अक्टूबर 2007 में जारी किया गया, जिसमें एक ऑब्जेक्टिव-सी 2.0 कंपाइलर शामिल था। GNU कम्पाइलर संग्रह|GCC 4.6 कई नई ऑब्जेक्टिव-सी सुविधाओं का समर्थन करता है, जैसे कि घोषित और संश्लेषित गुण, डॉट सिंटैक्स, तेज़ गणना, वैकल्पिक प्रोटोकॉल विधियाँ, विधि/प्रोटोकॉल/क्लास विशेषताएँ, क्लास एक्सटेंशन, और एक नया GNU ऑब्जेक्टिव-सी रनटाइम एपीआई. नामकरण ऑब्जेक्टिव-सी 2.0 भाषा के संस्करण प्रणाली में एक विराम का प्रतिनिधित्व करता है, क्योंकि NeXT के लिए अंतिम ऑब्जेक्टिव-सी संस्करण objc4 था। इस प्रोजेक्ट का नाम Mac OS X Leopard (10.5) में लीगेसी ऑब्जेक्टिव-सी रनटाइम सोर्स कोड की पिछली रिलीज़ में रखा गया था।

कचरा संग्रह
उद्देश्य-सी 2.0 ने एक वैकल्पिक रूढ़िवादी, पीढ़ीगत कचरा संग्रह (कंप्यूटर विज्ञान) प्रदान किया। जब बैकवर्ड-संगत मोड में चलाया जाता है, तो रनटाइम संदर्भ गिनती ऑपरेशंस जैसे रिटेन और रिलीज को नो-ऑप्स में बदल देता है। कचरा संग्रह सक्षम होने पर सभी ऑब्जेक्ट कचरा संग्रह के अधीन थे। अंतर्निहित राइट-बैरियर कंपाइलर इंटरसेप्ट्स को ट्रिगर करने के लिए नियमित सी पॉइंटर्स को __strong के साथ योग्य किया जा सकता है और इस प्रकार कचरा संग्रह में भाग लेते हैं। एक शून्य-इंग कमजोर सबसिस्टम भी प्रदान किया गया था जैसे कि __weak के रूप में चिह्नित पॉइंटर्स शून्य पर सेट होते हैं जब ऑब्जेक्ट (या अधिक सरलता से, GC मेमोरी) एकत्र किया जाता है। ऑब्जेक्टिव-सी 2.0 के आईओएस कार्यान्वयन पर कचरा संग्रहकर्ता मौजूद नहीं है। ऑब्जेक्टिव-सी में कचरा संग्रह कम प्राथमिकता वाले पृष्ठभूमि थ्रेड पर चलता है, और उपयोगकर्ता अनुभव को उत्तरदायी रखने के इरादे से उपयोगकर्ता ईवेंट पर रोक सकता है। स्वचालित संदर्भ गणना (एआरसी) के पक्ष में मैक ओएस एक्स v10.8 में कचरा संग्रह बहिष्कृत किया गया था। ARM64 पर चल रहे iOS 7 पर Objective-C 64-बिट शब्द में से 19 बिट्स का उपयोग रेफरेंस काउंट को टैग किए गए पॉइंटर्स के रूप में स्टोर करने के लिए करता है।

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @इंटरफेस व्यक्ति: एनएसओब्जेक्ट { @जनता एनएसएसटींग * नाम; @निजी अंतर आयु; }

@ संपत्ति (प्रतिलिपि) एनएसएसटींग * नाम; @ संपत्ति (आसानी से) int उम्र;

- (आईडी) initWithAge: (int) उम्र; @अंत </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @ कार्यान्वयन व्यक्ति @संश्लेषित नाम;

- (आईडी) initWithAge: (int) initAge { स्व = [सुपर इनिट]; अगर (स्वयं) { // नोट: डायरेक्ट इंस्टेंस वेरिएबल असाइनमेंट, प्रॉपर्टी सेटर नहीं उम्र = initAge; } स्वयं लौटें; }

- (इंट) उम्र { वापसी की उम्र; } @अंत </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> व्यक्ति *aPerson = व्यक्ति आवंटित] initWithAge:53]; aPerson.name = @ स्टीव; // नोट: डॉट नोटेशन, संश्लेषित सेटर का उपयोग करता है, // [एपर्सन सेटनाम: @ स्टीव] के बराबर; NSLog(@ संदेश द्वारा एक्सेस (%@), डॉट नोटेशन(%@), संपत्ति का नाम (% @) और       प्रत्यक्ष उदाहरण चर पहुँच (% @),              [एक व्यक्ति का नाम],      aPerson.name, [aPerson valueForKey:@ name ], aPerson -> name); </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) गुणों के साथ मेरा परिचय दें: (बूल) उपयोग गेट्टर { NSLog(@ नमस्ते, मेरा नाम %@ है। // नोट: गेटर बनाम इवर एक्सेस } </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> int मैं; इंट प्रॉपर्टीकाउंट = 0; objc_property_t * संपत्ति सूची = class_copyPropertyList([aPerson class], &propertyCount);

के लिए (i = 0; i <propertyCount; i++) { objc_property_t * यह संपत्ति = संपत्ति सूची + i; const char *propertyName = property_getName(*thisProperty); NSLog(@ व्यक्ति के पास संपत्ति है: '%s', संपत्तिनाम); } </वाक्यविन्यास हाइलाइट>

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // एनएसईन्यूमेरेटर का उपयोग करना NSEnumerator *गणक = [पीपुल ऑब्जेक्टएन्यूमरेटर]; व्यक्ति *पी;

जबकि ((पी = [एन्यूमरेटर नेक्स्टऑब्जेक्ट])! = शून्य) { NSLog(@ %@% i साल पुराना है।, [पी नाम], [पी उम्र]); } </वाक्यविन्यास हाइलाइट>

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // इंडेक्स का उपयोग करना के लिए (int i = 0; i <[लोग गिनती]; i++) { व्यक्ति * पी = [पीपल ऑब्जेक्ट एट इंडेक्स: आई]; NSLog(@ %@% i साल पुराना है।, [पी नाम], [पी उम्र]); } </वाक्यविन्यास हाइलाइट>

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // तेज गणना का उपयोग करना for (Person *p in thePeople) { NSLog(@ %@% i साल पुराना है।, [पी नाम], [पी उम्र]); } </वाक्यविन्यास हाइलाइट>

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

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

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

ब्लॉक
ब्लॉक उद्देश्य-सी (और सी (प्रोग्रामिंग भाषा) और सी ++) के लिए एक गैर-मानक विस्तार है जो क्लोजर (प्रोग्रामिंग) बनाने के लिए विशेष सिंटैक्स का उपयोग करता है। ब्लॉक केवल Mac OS X स्नो लेपर्ड|Mac OS X 10.6 स्नो लेपर्ड या बाद के संस्करण, iOS 4 या उसके बाद के संस्करण, और libobjc2 1.7 के साथ GNUstep और क्लैंग 3.1 या बाद के संस्करण के साथ संकलन में समर्थित हैं। <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> टाइपपीफ इंट (^ इंटब्लॉक) ;
 * 1) शामिल <stdio.h>
 * 2) शामिल <Block.h>

इंटब्लॉक मेककाउंटर (इंट स्टार्ट, इंट इंक्रीमेंट) { __ ब्लॉक इंट आई = स्टार्ट;

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

}

पूर्णांक मुख्य (शून्य) { इंटब्लॉक मायकाउंटर = मेककाउंटर (5, 2); प्रिंटफ (पहली कॉल:% d \ n, मायकाउंटर ); प्रिंटफ (दूसरा कॉल:% d \ n, मायकाउंटर ); प्रिंटफ (तीसरा कॉल:% d \ n, मायकाउंटर );

/ * क्योंकि इसकी नकल की गई थी, इसे भी जारी किया जाना चाहिए * / ब्लॉक_रिलीज़ (मायकाउंटर);

वापसी 0; } / * आउटपुट: पहली कॉल: 5 दूसरी कॉल: 7 तीसरी कॉल: 9 </वाक्यविन्यास हाइलाइट>

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

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

एआरसी को एलएलवीएम 3.0 में पेश किया गया था। यह Xcode 4.2 (2011), या Apple LLVM कंपाइलर 3.0 में अनुवाद करता है।

शाब्दिक
NeXT और Apple Obj-C रनटाइम में लंबे समय से शाब्दिक सिंटैक्स का उपयोग करके नए तार बनाने का एक छोटा-सा तरीका शामिल है, या CoreFoundation स्थिरांक पर ड्रॉप करें   और   के लिए   बूलियन मूल्यों के साथ। इस प्रारूप का उपयोग करने से प्रोग्रामर को अधिक समय तक उपयोग करने से बचाया जाता है   या इसी तरह के तरीके कुछ संचालन करते समय।

Apple LLVM कंपाइलर 4.0 (Xcode 4.4) या बाद के संस्करण का उपयोग करते समय, सरणियाँ, शब्दकोश और संख्याएँ (, ,   कक्षाएं) विधियों के बजाय शाब्दिक सिंटैक्स का उपयोग करके भी बनाई जा सकती हैं। <रेफरी नाम = ओब्ज-सी के साथ प्रोग्रामिंग - मान और संग्रह></ रेफ> (ऐप्पल एलएलवीएम कंपाइलर 4.0 ओपन सोर्स एलएलवीएम और क्लैंग 3.1 में अनुवाद करता है।) रेफरी नाम = llvm31></रेफरी>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> 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]; </वाक्यविन्यास हाइलाइट>

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

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> आईडी ऑब्जेक्ट 1 = [कुछ ऐरे ऑब्जेक्टएट इंडेक्स: 0]; आईडी ऑब्जेक्ट 2 = [कुछ डिक्शनरी ऑब्जेक्टफॉरकी: @ कुंजी]; [someMutableArray की जगहObjectAtIndex:0 withObject:object3]; [someMutableDictionary setObject: object4 forKey:@ key]; </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> आईडी ऑब्जेक्ट 1 = कुछ ऐरे [0]; आईडी ऑब्जेक्ट 2 = कुछ डिक्शनरी [@ कुंजी]; someMutableArray[0] = object3; कुछ म्यूटेबल डिक्शनरी [@ कुंजी] = ऑब्जेक्ट 4; </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> वस्तु = MyClass आवंटन] init]; [ऑब्जेक्ट फर्स्ट लेबल: पैराम 1 सेकेंड लेबल: पैराम 2]; </वाक्यविन्यास हाइलाइट>

इसके बजाय इसे लिखा गया था

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> वस्तु = (MyClass.alloc).init; ऑब्जेक्ट.लेबल ( param1, param2 ); </वाक्यविन्यास हाइलाइट>

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

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) पहला लेबल: (int) param1 दूसरा लेबल: (int) param2; </वाक्यविन्यास हाइलाइट>

को

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) लेबल ( int param1, int param2 ); </वाक्यविन्यास हाइलाइट>

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

मूल-objc
प्रोजेक्ट ऑब्जेक्टिव-सी का एक और री-इम्प्लीमेंटेशन है। यह बैकएंड के रूप में जीएनयू कंपाइलर संग्रह या क्लैंग/एलएलवीएम कंपाइलर्स का समर्थन करता है। यह सिंटैक्स, शब्दार्थ और ABI संगतता के संदर्भ में अन्य रनटाइम से अलग हो जाता है। यह Linux, FreeBSD और Windows को सपोर्ट करता है।

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

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

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

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

अपने क्लैंग-आधारित एलएलवीएम कंपाइलर के लिए ऐप्पल की वर्जनिंग स्कीम एलएलवीएम के ओपन-सोर्स वर्जनिंग से अलग है। देखना एक अनुवाद के लिए

जीएनयू, जीएनयूस्टेप, और विनओबीजेसी
GNU प्रोजेक्ट, लंबे समय से, NeXT और Obj-C प्रोग्राम को पोर्ट करने के लिए एक प्लेटफॉर्म में रुचि रखता है। के लिए चेंजलॉग जीसीसी में निर्देशिका से पता चलता है कि यह 1998 (जीसीसी 2.95) से पहले अस्तित्व में था, और इसके रीडमे ने 1993 (जीसीसी 2.4) में एक पुनर्लेखन पर आगे इशारा किया। NeXT फ्रंटएंड सोर्स कोड जारी किया गया था क्योंकि इसे GCC के हिस्से के रूप में बनाया गया था, GNU पब्लिक लाइसेंस जारी किया गया था जो ऐसा करने के लिए व्युत्पन्न कार्यों को करने के लिए मजबूर करता है। Apple ने 4.2.1 तक GCC के अपने फोर्क को जारी करने में इस परंपरा को जारी रखा, जिसके बाद उन्होंने कंपाइलर को छोड़ दिया। जीसीसी अनुरक्षकों ने परिवर्तनों को स्वीकार किया, लेकिन ऑब्जेक्टिव-सी 2.0 भाषा जैसी नई सुविधाओं का समर्थन करने में ज्यादा निवेश नहीं किया। नई भाषा में रुचि रखने वाले जीएनयूस्टेप डेवलपर्स ने जीसीसी को फोर्क किया जीसीसी से स्वतंत्र एक परियोजना के लिए कहा जाता है  2009 में। उन्होंने नई भाषा सिंटैक्स का लाभ उठाने के लिए क्लैंग के साथ रनटाइम के उपयोग की भी व्यवस्था की।  जीसीसी एक ही समय में धीरे-धीरे चला गया, लेकिन जीसीसी 4.6.0 (2011) में वे ऑब्जेक्टिव-सी 2.0 पर अपने libobjc में भी चले गए हैं। जीएनयूस्टेप प्रलेखन सुझाव देता है कि जीसीसी कार्यान्वयन में अभी भी ब्लॉक, गैर-नाजुक चर और नए एआरसी के लिए समर्थन की कमी है। माइक्रोसॉफ्ट कांटा 2015 में WinObjC के एक हिस्से में, यूनिवर्सल विंडोज प्लेटफॉर्म के लिए आईओएस ब्रिज। कोको टच और अंतर्निहित एपीआई के अपने स्वयं के कार्यान्वयन के साथ संयुक्त, परियोजना यूडब्ल्यूपी ऐप्स के अंदर आईओएस एप्लिकेशन कोड के पुन: उपयोग की अनुमति देती है। विंडोज़ पर, उद्देश्य-सी विकास उपकरण जीएनयूस्टेप की वेबसाइट पर डाउनलोड करने के लिए प्रदान किए जाते हैं। GNUStep डेवलपमेंट सिस्टम में निम्नलिखित पैकेज होते हैं: GNUstep MinGW सिस्टम, GNUstep Core, GNUstep Devel, GNUstep Cairo, ProjectCenter IDE (Xcode की तरह, लेकिन उतना जटिल नहीं), Gorm (इंटरफ़ेस बिल्डर लाइक Xcode NIB बिल्डर)। ये बाइनरी इंस्टॉलर 2016 से अपडेट नहीं किए गए हैं, इसलिए इसके बजाय Cygwin या MSYS2 के तहत निर्माण करके स्थापित करना एक बेहतर विचार हो सकता है।

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

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

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

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

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

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

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

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

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

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

स्मृति प्रबंधन
ऑब्जेक्टिव-सी के पहले संस्करण कचरा संग्रह (कंप्यूटर विज्ञान) का समर्थन नहीं करते थे। उस समय यह निर्णय कुछ बहस का विषय था, और कई लोगों ने पूरे सिस्टम को अनुपयोगी बनाने के लिए लॉन्ग डेड टाइम (जब स्मॉलटाक ने संग्रह का प्रदर्शन किया) माना। कुछ तीसरे पक्ष के कार्यान्वयन ने इस सुविधा को जोड़ा है (सबसे विशेष रूप से Boehm कचरा संग्राहक का उपयोग करके GNUstep), और Apple ने इसे Mac OS X v10.5 के रूप में लागू किया है। हालाँकि, macOS और iOS के अधिक हाल के संस्करणों में, कचरा संग्रह को 2011 में शुरू की गई स्वचालित संदर्भ गणना (ARC) के पक्ष में बहिष्कृत कर दिया गया है।

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

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

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

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

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

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

यह भी देखें

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

बाहरी संबंध

 * Programming with Objective-C, from Apple (2012-12-13)
 * The Objective-C Programming Language, from Apple (2011-10-11)
 * Objective-C Runtime Programming Guide, from Apple (2009-10-19)
 * Objective-C GNUstep Base Programming Manual
 * Objective-C by Brad Cox
 * Objective-C FAQ