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

From Vigyanwiki
Revision as of 16:44, 2 November 2023 by Abhishekkshukla (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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.

बाहरी संबंध