ऑब्जेक्टिव-सी
परिवार | C |
---|---|
द्वारा डिज़ाइन किया गया | Tom Love and Brad Cox |
पहली प्रस्तुति | 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 के दशक की प्रारंभ में ब्रैड कॉक्स और टॉम लव द्वारा विकसित किया गया था, इसे नेक्स्ट द्वारा अपने नेक्स्ट स्टेप ऑपरेटिंग सिस्टम के लिए चुना गया था। एप्पल Inc. मैक ओएस की नेक्स्ट स्टेप से सीधी वंशावली के कारण,[4] ऑब्जेक्टिव-सी, स्विफ्ट (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा की प्रारंभआत तक मैक ओएस और आईओएस एप्लिकेशन (उनके संबंधित अप्लिकेशन प्रोग्रामिंग अंतरफलक, कोको (एपीआई) और कोको टच के माध्यम से) विकसित करने के लिए एप्पल द्वारा उपयोग की जाने वाली, समर्थित और प्रचारित मानक प्रोग्रामिंग भाषा थी। 2014 में।[3]
गैर-एप्पल ऑपरेटिंग सिस्टम के लिए विकसित ऑब्जेक्टिव-सी प्रोग्राम या जो ऐप्पल के एपीआई पर निर्भर नहीं हैं, उन्हें जीएनयू जीएनयू संकलक संग्रह या एलएलवीएम/क्लैंग द्वारा समर्थित किसी भी कंप्यूटर मंच के लिए भी संकलित किया जा सकता है।
उद्देश्य-सी स्रोत कोड 'मैसेजिंग/कार्यान्वयन' प्रोग्राम फ़ाइलें सामान्यतः होती हैं .m फ़ाइल नाम एक्सटेंशन, जबकि ऑब्जेक्टिव-सी 'हेडर/इंटरफ़ेस' फ़ाइलें हैं .h एक्सटेंशन, सी हेडर फाइलों के समान। ऑब्जेक्टिव- C++ फाइलों को a से निरूपित किया जाता है .mm फाइल एक्सटेंशन।
इतिहास
ऑब्जेक्टिव-सी मुख्य रूप से ब्रैड कॉक्स और टॉम लव द्वारा 1980 के दशक की प्रारंभ में उनकी कंपनी कदम पत्थर | प्रोडक्टिविटी प्रोडक्ट्स इंटरनेशनल (पीपीआई) में बनाया गया था।[5]
अपनी कंपनी के निर्माण के लिए अग्रणी, दोनों को 1981 में आई.टी.टी कॉर्पोरेशन के प्रोग्रामिंग टेक्नोलॉजी सेंटर में रहते हुए स्मॉलटाक से परिचित कराया गया था। ऑब्जेक्टिव-सी पर सबसे पहला काम उसी समय के आसपास का है।[6] सॉफ्टवेयर इंजीनियरिंग और प्रोग्रामिंग में वास्तविक पुन: प्रयोज्यता की समस्याओं से कॉक्स को परेशान किया गया था। उन्होंने अनुभव किया कि आईटीटी में सिस्टम डेवलपर्स के लिए विकास के वातावरण के निर्माण में स्मॉलटाक जैसी भाषा अमूल्य होगी। चुकी, उन्होंने और टॉम लव ने यह भी माना कि आईटीटी के टेलीकॉम इंजीनियरिंग परिवेश में सी के साथ पश्चगामी संगतता गंभीर रूप से महत्वपूर्ण थी।[7]
कॉक्स ने स्मॉलटाक की कुछ क्षमताओं को जोड़ने के लिए सी (प्रोग्रामिंग भाषा) के लिए प्री-प्रोसेसर लिखना प्रारंभ किया। जल्द ही उनके पास C (प्रोग्रामिंग लैंग्वेज) लैंग्वेज के लिए एक ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन का कार्य कार्यान्वयन था, जिसे उन्होंने ऑब्जेक्ट-ओरिएंटेड प्री-कंपाइलर के लिए ओओपीसी कहा।[8]
लव को 1982 में श्लम्बरगर रिसर्च द्वारा काम पर रखा गया था और उन्हें स्मॉलटाक -80 की पहली व्यावसायिक प्रति प्राप्त करने का अवसर मिला, जिसने उनके दिमाग की उपज के विकास को और प्रभावित किया। यह प्रदर्शित करने के लिए कि वास्तविक प्रगति की जा सकती है, कॉक्स ने दिखाया कि विनिमेय सॉफ़्टवेयर घटकों को वास्तव में वर्त्तमान उपकरणों में केवल कुछ व्यावहारिक परिवर्तनों की आवश्यकता है। विशेष रूप से, उन्हें लचीले तरीके से वस्तुओं का समर्थन करने की आवश्यकता होती है, पुस्तकालयों के उपयोग योग्य सेट के साथ आपूर्ति की जाती है, और कोड (और कोड द्वारा आवश्यक किसी भी संसाधन) को एक क्रॉस-प्लेटफ़ॉर्म प्रारूप में बंडल करने की अनुमति देता है।
लव एंड कॉक्स ने अंततः अपने उत्पाद का व्यावसायीकरण करने के लिए पीपीआई का गठन किया, जिसमें एक ऑब्जेक्टिव-सी कंपाइलर को क्लास लाइब्रेरी के साथ जोड़ा गया। 1986 में, कॉक्स ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, एक विकासवादी दृष्टिकोण पुस्तक में ऑब्जेक्टिव-सी का मुख्य विवरण अपने मूल रूप में प्रकाशित किया। यद्यपि वह यह इंगित करने के लिए सावधान था कि उद्देश्य-सी प्रदान करने की तुलना में पुन: प्रयोज्यता की समस्या के लिए और भी कुछ है, भाषा अक्सर अन्य भाषाओं के साथ फीचर के लिए फीचर की तुलना करती है।
=== नेक्स्ट === के माध्यम से लोकप्रियता
1988 में, नेक्स्ट ने स्टेपस्टोन (पीपीआई का नया नाम, ऑब्जेक्टिव-सी ट्रेडमार्क का मालिक) से ऑब्जेक्टिव-सी लाइसेंस प्राप्त किया और ऑब्जेक्टिव-सी का समर्थन करने के लिए जीएनयू कंपाइलर कलेक्शन कंपाइलर का विस्तार किया। नेक्स्ट ने आवेदन किट और फाउंडेशन किट लाइब्रेरी विकसित की, जिस पर नेक्स्टस्टेप यूजर इंटरफेस और इंटरफेस बिल्डर आधारित थे। जबकि नेक्स्ट वर्कस्टेशन बाज़ार में एक बड़ा प्रभाव बनाने में विफल रहे, उद्योग में उपकरणों की व्यापक रूप से सराहना की गई। इसने नेक्स्ट को हार्डवेयर उत्पादन को छोड़ने और सॉफ्टवेयर टूल्स पर ध्यान केंद्रित करने, कस्टम प्रोग्रामिंग के लिए एक मंच के रूप में नेक्स्टस्टेप (और ओपनस्टेप) को बेचने का नेतृत्व किया।
जीपीएल की शर्तों को किनारे करने के लिए, नेक्स्ट मूल रूप से ऑब्जेक्टिव-सी फ्रंटएंड को अलग से शिप करने का प्रयोजन रखता था, जिससे उपयोगकर्ता इसे जीसीसी के साथ लिंक करके कंपाइलर निष्पादन योग्य बना सके। चुकी प्रारंभ में रिचर्ड एम. स्टॉलमैन द्वारा स्वीकार किया गया था, स्टॉलमैन द्वारा जीएनयू के वकीलों के साथ परामर्श करने के बाद इस योजना को अस्वीकार कर दिया गया था और नेक्स्ट ने ऑब्जेक्टिव-सी को जीसीसी का भाग बनाने पर सहमति व्यक्त की थी।[9]
जीएनयू कंपाइलर संग्रह का विस्तार करने का काम स्टीव नारॉफ के नेतृत्व में किया गया था, जो स्टेपस्टोन से नेक्स्ट में सम्मिलित हुए थे। जीएनयू पब्लिक लाइसेंस लाइसेंस शर्तों के अनुसार संकलक परिवर्तन उपलब्ध कराए गए थे, लेकिन रनटाइम पुस्तकालय नहीं थे, जो खुले स्रोत के योगदान को आम जनता के लिए अनुपयोगी बना रहे थे। इसने अन्य पार्टियों को ओपन सोर्स लाइसेंस के अनुसार ऐसी रनटाइम लाइब्रेरी विकसित करने के लिए प्रेरित किया। बाद में, क्लैंग के लिए ऑब्जेक्टिव-सी फ्रंटएंड बनाने के लिए एप्पल में काम करने के लिए स्टीव नारॉफ का भी प्रमुख योगदान था।
जीएनयू परियोजना ने ओपनस्टेप मानक के आधार पर जीएनयूस्टेप नामक कोको (एपीआई) के अपने मुफ्त सॉफ्टवेयर कार्यान्वयन पर काम प्रारंभ किया।[10] डेनिस ग्लैटिंग ने 1992 में पहला जीएनयू ऑब्जेक्टिव-सी रन टाइम सिस्टम लिखा था। जीएनयू ऑब्जेक्टिव-सी रनटाइम, जो 1993 से उपयोग में है, क्रेस्टन क्रैब थोरुप द्वारा विकसित किया गया है जब वह डेनमार्क में एक विश्वविद्यालय के छात्र थे।[citation needed] थोरुप ने 1993 से 1996 तक नेक्स्ट में भी काम किया।[11]
सेब विकास और स्विफ्ट
1996 में नेक्स्ट को प्राप्त करने के बाद, एप्पल कंप्यूटर ने अपने तत्कालीन नए ऑपरेटिंग सिस्टम, मैक ओयस एक्स में ओपनस्टेप का उपयोग किया। इसमें उद्देश्य सी, नेक्स्ट का उद्देश्य सी- आधारित डेवलपर टूल, प्रोजेक्ट बिल्डर और इसका इंटरफ़ेस डिज़ाइन टूल, इंटरफ़ेस बिल्डर सम्मिलित थे। दोनों को बाद में एक एप्लिकेशन, एक्सकोड में मिला दिया गया। एप्पल का अधिकांश वर्तमान कोको (एपीआई) ओपनस्टेप इंटरफ़ेस ऑब्जेक्ट्स पर आधारित है और सक्रिय विकास के लिए उपयोग किया जा रहा सबसे महत्वपूर्ण ऑब्जेक्टिव-सी वातावरण है।
डब्ल्यूडब्ल्यूडीसी 2014 में, एप्पल ने एक नई भाषा, स्विफ्ट (प्रोग्रामिंग लैंग्वेज) पेश की, जिसे C के बिना ऑब्जेक्टिव-सी के रूप में चित्रित किया गया था।
सिंटेक्स
ऑब्जेक्टिव-सी सी (प्रोग्रामिंग लैंग्वेज) के ऊपर एक पतली परत है और सी का एक सख्त सुपरसेट है, जिसका अर्थ है कि किसी भी सी प्रोग्राम को ऑब्जेक्टिव-सी कंपाइलर के साथ संकलित करना और ऑब्जेक्टिव-सी क्लास के अन्दर सी भाषा कोड को स्वतंत्र रूप से सम्मिलित करना संभव है। .[12][13][14][15][16][17]
ऑब्जेक्टिव-सी स्मॉलटाक से अपना ऑब्जेक्ट सिंटैक्स प्राप्त करता है। गैर-ऑब्जेक्ट-ओरिएंटेड ऑपरेशंस के लिए सभी सिंटैक्स (आदिम चर, प्री-प्रोसेसिंग, एक्सप्रेशन, फलन डिक्लेरेशन और फलन कॉल सहित) सी के समान हैं, जबकि ऑब्जेक्ट-ओरिएंटेड सुविधाओं के लिए सिंटैक्स स्मालटाक का कार्यान्वयन है।- शैली संदेश।
संदेश
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का ऑब्जेक्टिव-सी मॉडल ऑब्जेक्ट इंस्टेंस को भेजे जाने वाले संदेश पर आधारित है। ऑब्जेक्टिव-सी में कोई विधि नहीं कहता है; एक संदेश भेजता है। यह C ++ द्वारा उपयोग किए जाने वाले प्रारंभ- शैली प्रोग्रामिंग मॉडल के विपरीत है। इन दो अवधारणाओं के बीच का अंतर यह है कि विधि या संदेश नाम से संदर्भित कोड को कैसे निष्पादित किया जाता है। सिमुला-शैली की भाषा में, विधि का नाम अधिकांशतः स्थितियों में संकलक द्वारा लक्ष्य वर्ग में कोड के एक खंड के लिए बाध्यकारी होता है। स्मॉलटॉक और ऑब्जेक्टिव-सी में, संदेश का लक्ष्य रनटाइम पर हल किया जाता है, जिसमें प्राप्त वस्तु स्वयं संदेश की व्याख्या करती है। चयनकर्ता या द्वारा विधि की पहचान की जाती है SEL — प्रत्येक संदेश नाम के लिए एक अद्वितीय पहचानकर्ता, अक्सर केवल एक अशक्त-समाप्त स्ट्रिंग |एनयूएल-टर्मिनेटेड स्ट्रिंग इसके नाम का प्रतिनिधित्व करती है - और इसे प्रयुक्त करने वाले C मेथड सूचक (कंप्यूटर प्रोग्रामिंग) के लिए हल किया गया: एक IMP.[18] इसका एक परिणाम यह है कि संदेश-पासिंग प्रणाली में कोई प्रकार की जाँच नहीं होती है। जिस वस्तु को संदेश निर्देशित किया गया है - प्राप्तकर्ता - को संदेश का जवाब देने की गारंटी नहीं है, और यदि ऐसा नहीं होता है, तो यह अपवाद उठाता है।[19]
संदेश भेज रहा हूँ विधि सूचक द्वारा इंगित वस्तु के लिए ओबीजे C ++ में निम्नलिखित कोड की आवश्यकता होगी:
obj->विधि(तर्क);
ऑब्जेक्टिव-सी में, इसे इस प्रकार लिखा गया है:
[obj method:argument];
मेथड कॉल का कंपाइलर द्वारा अनुवाद किया जाता है objc_msgSend(id self, SEL op, ...) रनटाइम कार्यों का परिवार। विभिन्न कार्यान्वयन आधुनिक परिवर्धन को संभालते हैं जैसे super.[20] जीएनयू परिवारों में इस समारोह का नाम है objc_msg_sendv, लेकिन इसके अनुसार एक आधुनिक लुकअप सिस्टम के पक्ष में इसे बहिष्कृत कर दिया गया है objc_msg_lookup.[21]
प्रोग्रामिंग की दोनों शैलियों की अपनी ताकत और कमजोरियां हैं। सिमुला (C ++) शैली में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग जब भी संभव हो तो संकलन-समय बाध्यकारी का उपयोग करके एकाधिक विरासत और तेज़ निष्पादन की अनुमति देता है, लेकिन यह डिफ़ॉल्ट रूप से गतिशील प्रेषण का समर्थन नहीं करता है। जब तक वे सार पद्धति नहीं हैं, तब तक यह सभी विधियों को एक समान कार्यान्वयन के लिए बाध्य करता है। ऑब्जेक्टिव-सी में उपयोग की जाने वाली स्मॉलटाक-शैली की प्रोग्रामिंग संदेशों को बिना क्रियान्वित किए जाने की अनुमति देती है, रनटाइम पर इसके कार्यान्वयन के लिए हल की गई विधि के साथ। उदाहरण के लिए, वस्तुओं के संग्रह के लिए एक संदेश भेजा जा सकता है, जिसके लिए रनटाइम त्रुटियों के उत्पादन के डर के बिना केवल कुछ लोगों को प्रतिक्रिया देने की उम्मीद की जाएगी। संदेश पास करने के लिए यह भी आवश्यक नहीं है कि किसी वस्तु को संकलन समय पर परिभाषित किया जाए। व्युत्पन्न वस्तु में विधि को बुलाए जाने के लिए अभी भी एक कार्यान्वयन की आवश्यकता है। (गतिशील (देर से) बाइंडिंग के अधिक लाभों के लिए नीचे #गतिशील टाइपिंग अनुभाग देखें।)
इंटरफेस और कार्यान्वयन
उद्देश्य-सी के लिए आवश्यक है कि एक वर्ग का इंटरफ़ेस और कार्यान्वयन अलग-अलग घोषित कोड ब्लॉक में हो। परिपाटी के अनुसार, डेवलपर्स इंटरफ़ेस को हेडर फ़ाइल में और कार्यान्वयन को कोड फ़ाइल में रखते हैं। हेडर फाइलें, सामान्य रूप से .एच, सी हेडर फाइलों के समान होती हैं, जबकि कार्यान्वयन (विधि) फाइलें, सामान्य रूप से प्रत्ययित होती हैं। एम, सी कोड फाइलों के समान हो सकती हैं।
इंटरफ़ेस
यह अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं, जैसे C++ या पायथन में उपयोग की जाने वाली क्लास डिक्लेरेशन के अनुरूप है।
किसी वर्ग का इंटरफ़ेस सामान्यतः हेडर फ़ाइल में परिभाषित किया जाता है। वर्ग के नाम के बाद हेडर फ़ाइल का नाम देना एक आम परंपरा है, उदा। 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) सम्मिलित करें पृष्ठ;
</वाक्यविन्यास हाइलाइट>
इंटरफ़ेस परिभाषा का व्युत्पन्न श्रेणी है, जो किसी को वर्त्तमान कक्षाओं में विधियों को जोड़ने की अनुमति देता है।[22]
कार्यान्वयन
इंटरफ़ेस केवल क्लास इंटरफ़ेस की घोषणा करता है न कि स्वयं विधियों की: वास्तविक कोड कार्यान्वयन फ़ाइल में लिखा गया है। कार्यान्वयन (विधि) फ़ाइलों में सामान्य रूप से फ़ाइल एक्सटेंशन होता है .m
, जो मूल रूप से संदेशों को दर्शाता था।[23]
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
@कार्यान्वयन वर्गनाम
+ (वापसी_ प्रकार) वर्ग विधि {
// कार्यान्वयन
} - (वापसी_प्रकार) उदाहरण विधि {
// कार्यान्वयन
} @अंत </वाक्यविन्यास हाइलाइट>
विधियों को उनके इंटरफ़ेस घोषणाओं का उपयोग करके लिखा गया है। ऑब्जेक्टिव-सी और सी की तुलना:
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (इंट) विधि: (इंट) मैं {
वापसी [स्व वर्ग_रोट: मैं];
} </वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास प्रकाश लैंग = सी> इंट फंक्शन (इंट आई) {
वापसी वर्ग_रूट (i);
} </वाक्यविन्यास हाइलाइट>
सिंटैक्स छद्म-नामित पैरामीटर की अनुमति देता है।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) रंग बदलने के लिए लाल: (फ्लोट) लाल हरा: (फ्लोट) हरा नीला: (फ्लोट) नीला {
//... कार्यान्वयन ...
}
// इस तरह कहा जाता है: [myColor changeColorToRed:5.0 हरा:2.0 नीला:6.0]; </वाक्यविन्यास हाइलाइट>
उद्देश्य-सी के विभिन्न कार्यान्वयनों के बीच एक विधि का आंतरिक प्रतिनिधित्व भिन्न होता है। अगर myColor क्लास का है 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 ऑब्जेक्ट]; MyObject *bar = [MyObject objectWithString:@ विकिपीडिया :)]; </वाक्यविन्यास हाइलाइट>
आबंटन संदेश किसी वस्तु के लिए सभी उदाहरण चर को रखने के लिए पर्याप्त मेमोरी आवंटित करता है, सभी उदाहरण चर को शून्य मानों पर सेट करता है, और स्मृति को वर्ग के उदाहरण में बदल देता है; प्रारंभिकरण के दौरान किसी भी समय स्मृति सुपरक्लास का एक उदाहरण नहीं है।
Init संदेश निर्माण पर उदाहरण का सेट-अप करता है। Init विधि को अक्सर इस प्रकार लिखा जाता है:
<वाक्यविन्यास लैंग = ओबीजेसी लाइन> - (आईडी) init {
स्व = [सुपर इनिट]; अगर (स्वयं) { // यहाँ वस्तु का आरंभीकरण करें } स्वयं लौटें;
} </वाक्यविन्यास हाइलाइट>
उपरोक्त उदाहरण में, ध्यान दें id
वापसी का प्रकार। यह प्रकार उद्देश्य सी में किसी भी वस्तु के सूचक के लिए खड़ा है (#Dynamic टाइपिंग अनुभाग देखें)।
इनिशियलाइज़र पैटर्न का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को उसके सुपरक्लास द्वारा ठीक से इनिशियलाइज़ किया जाता है, इससे पहले कि इनिट मेथड अपना इनिशियलाइज़ेशन करता है। यह निम्नलिखित क्रियाएं करता है:
- लाइन 2
- सुपरक्लास उदाहरण को एक init संदेश भेजता है और स्वयं को परिणाम प्रदान करता है (वर्तमान वस्तु के लिए सूचक)।
- पंक्ति 3
- जाँचता है कि क्या लौटाया गया ऑब्जेक्ट पॉइंटर किसी भी इनिशियलाइज़ेशन को करने से पहले वैध है।
- पंक्ति 6
- कॉल करने वाले को स्वयं का मान लौटाता है।
एक गैर-वैध ऑब्जेक्ट पॉइंटर का मान शून्य होता है; सशर्त बयान जैसे अगर शून्य को शून्य सूचक की तरह मानते हैं, तो प्रारंभिक कोड को निष्पादित नहीं किया जाएगा [super init]
शून्य लौटा। यदि इनिशियलाइज़ेशन में कोई त्रुटि है, तो इनिट मेथड को कोई भी आवश्यक सफाई करनी चाहिए, जिसमें स्वयं को एक रिलीज़ संदेश भेजना सम्मिलित है, और यह इंगित करने के लिए कि इनिशियलाइज़ेशन विफल हो गया है, वापस लौटें। ऐसी त्रुटियों के लिए कोई भी जाँच केवल सुपरक्लास इनिशियलाइज़ेशन को कॉल करने के बाद ही की जानी चाहिए ताकि यह सुनिश्चित हो सके कि वस्तु को नष्ट करना सही तरीके से किया जाएगा।
यदि किसी वर्ग में एक से अधिक इनिशियलाइज़ेशन मेथड हैं, तो उनमें से केवल एक (नामित इनिशियलाइज़र) को इस पैटर्न का पालन करने की आवश्यकता है; दूसरों को सुपरक्लास इनिशियलाइज़र के बजाय नामित इनिशियलाइज़र को कॉल करना चाहिए।
प्रोटोकॉल
अन्य प्रोग्रामिंग भाषाओं में, इन्हें इंटरफेस कहा जाता है।
प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) की प्रारंभ के माध्यम से विनिर्देशन की एकाधिक विरासत की अवधारणा को पेश करने के लिए ऑब्जेक्टिव-सी को नेक्स्ट में विस्तारित किया गया था, लेकिन कार्यान्वयन नहीं। यह एक ऐसा पैटर्न है जिसे या तो C++ में एक एब्स्ट्रैक्ट मल्टीपल इनहेरिटेड बेस क्लास के रूप में, या एक इंटरफ़ेस के रूप में प्राप्त किया जा सकता है (जैसा कि Java और C Sharp (प्रोग्रामिंग लैंग्वेज)|C#) में है। ऑब्जेक्टिव-सी तदर्थ प्रोटोकॉल का उपयोग करता है जिसे अनौपचारिक प्रोटोकॉल कहा जाता है और कंपाइलर-प्रयुक्त प्रोटोकॉल जिसे औपचारिक प्रोटोकॉल कहा जाता है।
एक अनौपचारिक प्रोटोकॉल विधियों की एक सूची है जिसे एक वर्ग प्रयुक्त करने का विकल्प चुन सकता है। यह दस्तावेज़ीकरण में निर्दिष्ट है, क्योंकि इसकी भाषा में कोई उपस्थिति नहीं है। अनौपचारिक प्रोटोकॉल एनएसओब्जेक्ट पर ऑब्जेक्टिव-सी#श्रेणियों (नीचे देखें) के रूप में प्रयुक्त किए जाते हैं और अक्सर वैकल्पिक तरीकों को सम्मिलित करते हैं, जो प्रयुक्त होने पर, कक्षा के व्यवहार को बदल सकते हैं। उदाहरण के लिए, एक टेक्स्ट फ़ील्ड क्लास में एक प्रतिनिधिमंडल (प्रोग्रामिंग) हो सकता है जो उपयोगकर्ता द्वारा टाइप किए गए टेक्स्ट को स्वत: पूर्ण करने के लिए एक वैकल्पिक विधि के साथ एक अनौपचारिक प्रोटोकॉल प्रयुक्त करता है। पाठ क्षेत्र पता लगाता है कि क्या प्रतिनिधि उस विधि को प्रयुक्त करता है (प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) के माध्यम से) और, यदि ऐसा है, तो स्वत: पूर्ण सुविधा का समर्थन करने के लिए प्रतिनिधि की विधि को कॉल करता है।
एक औपचारिक प्रोटोकॉल Java, C#, और Ada (प्रोग्रामिंग भाषा) में एक इंटरफ़ेस (कंप्यूटर विज्ञान) के समान है। यह उन तरीकों की एक सूची है जिसे कोई भी वर्ग प्रयुक्त करने के लिए खुद को घोषित कर सकता है। 2.0 से पहले ऑब्जेक्टिव-सी के संस्करणों के लिए आवश्यक है कि एक वर्ग को एक प्रोटोकॉल में सभी तरीकों को प्रयुक्त करना चाहिए जिसे वह खुद को अपनाने के रूप में घोषित करता है; यदि कक्षा अपने घोषित प्रोटोकॉल से प्रत्येक विधि को प्रयुक्त नहीं करती है तो संकलक एक त्रुटि का उत्सर्जन करेगा। उद्देश्य-सी 2.0 वैकल्पिक प्रोटोकॉल में कुछ विधियों को चिह्नित करने के लिए समर्थन जोड़ा गया है, और संकलक वैकल्पिक तरीकों के कार्यान्वयन को प्रयुक्त नहीं करेगा।
उस प्रोटोकॉल को प्रयुक्त करने के लिए कहा जाने वाला एक वर्ग घोषित किया जाना चाहिए। यह रनटाइम पर पता लगाने योग्य है। औपचारिक प्रोटोकॉल कोई कार्यान्वयन प्रदान नहीं कर सकते हैं; वे केवल कॉल करने वालों को आश्वस्त करते हैं कि प्रोटोकॉल के अनुरूप कक्षाएं कार्यान्वयन प्रदान करेंगी। नेक्स्ट/एप्पल लाइब्रेरी में, दूरस्थ सिस्टम पर निष्पादित ऑब्जेक्ट की क्षमताओं का प्रतिनिधित्व करने के लिए वितरित ऑब्जेक्ट सिस्टम द्वारा अक्सर प्रोटोकॉल का उपयोग किया जाता है।
वाक्य रचना
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @protocol एनएसएलॉकिंग - (शून्य) ताला; - (शून्य) अनलॉक; @अंत </वाक्यविन्यास हाइलाइट>
दर्शाता है कि लॉकिंग का अमूर्त विचार है। कक्षा परिभाषा में बताते हुए कि प्रोटोकॉल प्रयुक्त किया गया है,
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @interface NSLock: NSObject <NSLocking> // ... @अंत </वाक्यविन्यास हाइलाइट>
एनएसएलॉक के उदाहरण दावा करते हैं कि वे दो उदाहरण विधियों के लिए कार्यान्वयन प्रदान करेंगे।
गतिशील टाइपिंग
ऑब्जेक्टिव-सी, स्मॉलटॉक की तरह, डायनेमिक टाइपिंग का उपयोग कर सकता है: एक ऑब्जेक्ट को एक संदेश भेजा जा सकता है जो इसके इंटरफ़ेस में निर्दिष्ट नहीं है। यह बढ़े हुए लचीलेपन की अनुमति दे सकता है, क्योंकि यह एक वस्तु को एक संदेश को पकड़ने और एक अलग वस्तु को संदेश भेजने की अनुमति देता है जो संदेश को उचित रूप से प्रतिक्रिया दे सकता है, या इसी तरह संदेश को किसी अन्य वस्तु पर भेज सकता है। इस व्यवहार को संदेश अग्रेषण या प्रतिनिधिमंडल के रूप में जाना जाता है (नीचे देखें)। वैकल्पिक रूप से, संदेश को अग्रेषित नहीं किए जाने की स्थिति में एक त्रुटि हैंडलर का उपयोग किया जा सकता है। यदि कोई वस्तु किसी संदेश को अग्रेषित नहीं करती है, उसका जवाब नहीं देती है, या किसी त्रुटि को संभालती है, तो सिस्टम एक रनटाइम अपवाद उत्पन्न करेगा।[24] यदि संदेश शून्य (अशक्त वस्तु सूचक) को भेजे जाते हैं, तो उन्हें संकलक विकल्पों के आधार पर चुपचाप अनदेखा कर दिया जाएगा या एक सामान्य अपवाद उठाया जाएगा।
स्टेटिक टाइपिंग जानकारी वैकल्पिक रूप से वेरिएबल्स में भी जोड़ी जा सकती है। यह जानकारी तब संकलन समय पर जांची जाती है। निम्नलिखित चार बयानों में तेजी से विशिष्ट प्रकार की जानकारी प्रदान की जाती है। बयान रनटाइम के बराबर हैं, लेकिन अतिरिक्त जानकारी संकलक को प्रोग्रामर को चेतावनी देने की अनुमति देती है यदि पारित तर्क निर्दिष्ट प्रकार से मेल नहीं खाता है।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) सेट मायवैल्यू: (आईडी) फू; </वाक्यविन्यास हाइलाइट> उपरोक्त कथन में फू किसी भी वर्ग का हो सकता है।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (void)setMyValue:(id<NSCopying>)foo;
</वाक्यविन्यास हाइलाइट>
उपरोक्त कथन में, फू किसी भी वर्ग का एक उदाहरण हो सकता है जो इसके अनुरूप होNSCopying
शिष्टाचार।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> - (शून्य) सेट मायवैल्यू: (एनएसनंबर *) फू; </वाक्यविन्यास हाइलाइट> उपरोक्त बयान में, फू NSNumber वर्ग का एक उदाहरण होना चाहिए।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (void)setMyValue:(NSNumber<NSCopying> *)foo;
</वाक्यविन्यास हाइलाइट>
उपरोक्त कथन में, फू NSNumber वर्ग का एक उदाहरण होना चाहिए, और इसे इसके अनुरूप होना चाहिएNSCopying
शिष्टाचार।
ऑब्जेक्टिव-सी में, सभी ऑब्जेक्ट्स को पॉइंटर्स के रूप में दर्शाया जाता है, और स्टैटिक इनिशियलाइज़ेशन की अनुमति नहीं है। सबसे सरल वस्तु वह प्रकार है id (objc_obj *) इंगित करता है, जिसमें केवल एक आईएसए सूचक है जो इसकी कक्षा का वर्णन करता है। सी से अन्य प्रकार, जैसे मान और स्ट्रक्चर, अपरिवर्तित हैं क्योंकि वे ऑब्जेक्ट सिस्टम का भाग नहीं हैं। यह निर्णय C++ ऑब्जेक्ट मॉडल से भिन्न है, जहां संरचना और वर्ग संयुक्त हैं।
अग्रेषण
उद्देश्य-सी किसी वस्तु को संदेश भेजने की अनुमति देता है जो प्रतिक्रिया नहीं दे सकता है। संदेश का जवाब देने या बस छोड़ने के बजाय, एक वस्तु संदेश को उस वस्तु को अग्रेषित कर सकती है जो प्रतिक्रिया दे सकती है। अग्रेषण का उपयोग कुछ डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) के कार्यान्वयन को आसान बनाने के लिए किया जा सकता है, जैसे पर्यवेक्षक पैटर्न या प्रॉक्सी पैटर्न।
ऑब्जेक्टिव-सी रनटाइम विधियों की एक जोड़ी निर्दिष्ट करता है Object
- अग्रेषण विधियाँ: <वाक्यविन्यास लैंग = objc>
- (retval_t) आगे: (SEL) sel args: (arglist_t) args; // जीसीसी के साथ - (आईडी) आगे: (एसईएल) सेल तर्क: (मार्ग_सूची) तर्क; // नेक्स्ट/एप्पल सिस्टम के साथ</syntaxhighlight>
- क्रिया के तरीके: <वाक्यविन्यास लैंग = ओबीजेसी>
- (retval_t) प्रदर्शन वी: (एसईएल) सेल तर्क: (arglist_t) तर्क; // जीसीसी के साथ - (आईडी) प्रदर्शन वी: (एसईएल) सेल तर्क: (मार्ग_सूची) तर्क; // नेक्स्ट/एप्पल सिस्टम के साथ</syntaxhighlight>
अग्रेषण को प्रयुक्त करने की इच्छा रखने वाली वस्तु को अग्रेषण व्यवहार को परिभाषित करने के लिए केवल एक नई विधि के साथ अग्रेषण विधि को ओवरराइड करने की आवश्यकता होती है। क्रिया विधि performv:: ओवरराइड करने की आवश्यकता नहीं है, क्योंकि यह विधि चयनकर्ता और तर्कों के आधार पर केवल एक क्रिया करती है। ध्यान दें SEL
प्रकार, जो ऑब्जेक्टिव-सी में संदेशों का प्रकार है।
नोट: ओपनस्टेप, कोको, और जीएनयूस्टेप में, ऑब्जेक्टिव-सी के सामान्यतः उपयोग किए जाने वाले ढांचे, कोई इसका उपयोग नहीं करता है Object कक्षा। - (void)forwardInvocation:(NSInvocation *)anInvocation
}} की विधि NSObject अग्रेषण करने के लिए कक्षा का उपयोग किया जाता है।
उदाहरण
यहां एक प्रोग्राम का उदाहरण दिया गया है जो अग्रेषण की मूल बातें प्रदर्शित करता है।
- फारवर्डर। एच
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात <objc/Object.h>
@इंटरफेस फॉरवर्डर: ऑब्जेक्ट {
आईडी प्राप्तकर्ता; // जिस वस्तु को हम संदेश को अग्रेषित करना चाहते हैं।
}
// एक्सेसर के तरीके। - (आईडी) प्राप्तकर्ता; - (आईडी) सेट प्राप्तकर्ता: (आईडी) _ प्राप्तकर्ता; @अंत </वाक्यविन्यास हाइलाइट>
- फारवर्डर.एम
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात फारवर्डर.एच
@कार्यान्वयन फारवर्डर - (retval_t) आगे: (SEL) sel args: (arglist_t) args {
/* * जांचें कि प्राप्तकर्ता वास्तव में संदेश का जवाब देता है या नहीं। * यह वांछनीय हो सकता है या नहीं भी हो सकता है, उदाहरण के लिए, यदि कोई प्राप्तकर्ता * बदले में संदेश का जवाब नहीं देता है, यह अग्रेषण कर सकता है * अपने आप। */ अगर ([प्राप्तकर्ता ने चयनकर्ता को जवाब दिया: सेल]) { वापसी [प्राप्तकर्ता प्रदर्शन: एसईएल तर्क: तर्क]; } अन्य { वापसी [स्वयं त्रुटि: प्राप्तकर्ता जवाब नहीं देता]; }
}
- (आईडी) सेट प्राप्तकर्ता: (आईडी) _ प्राप्तकर्ता {
[प्राप्तकर्ता ऑटोरिलीज़]; प्राप्तकर्ता = [_प्राप्तकर्ता बनाए रखें]; स्वयं लौटें;
}
- (आईडी) प्राप्तकर्ता {
वापसी प्राप्तकर्ता;
} @अंत </वाक्यविन्यास हाइलाइट>
- प्राप्तकर्ता.एच
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात <objc/Object.h>
// एक साधारण प्राप्तकर्ता वस्तु। @ इंटरफेस प्राप्तकर्ता: ऑब्जेक्ट - (आईडी) हैलो; @अंत </वाक्यविन्यास हाइलाइट>
- प्राप्तकर्ता.एम
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात प्राप्तकर्ता.एच
@कार्यान्वयन प्राप्तकर्ता
- (आईडी) हैलो {
प्रिंटफ (प्राप्तकर्ता हैलो कहता है! \ n);
स्वयं लौटें;
}
@अंत </वाक्यविन्यास हाइलाइट>
- मुख्य.एम
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात फारवर्डर.एच
- आयात प्राप्तकर्ता.एच
पूर्णांक मुख्य (शून्य) {
फारवर्डर * फारवर्डर = [फॉरवर्डर नया]; प्राप्तकर्ता * प्राप्तकर्ता = [नया प्राप्तकर्ता];
[फारवर्डर सेट प्राप्तकर्ता: प्राप्तकर्ता]; // प्राप्तकर्ता सेट करें। /* * निरीक्षण करें कि फारवर्डर एक हैलो संदेश का जवाब नहीं देता है! यह *अग्रेषित करें। सभी गैर-मान्यता प्राप्त विधियों को अग्रेषित किया जाएगा * प्राप्तकर्ता * (यदि प्राप्तकर्ता उन्हें जवाब देता है, जैसा कि फारवर्डर में लिखा गया है) */ [फारवर्डर हैलो];
[प्राप्तकर्ता रिलीज]; [फारवर्डर रिलीज];
वापसी 0;
} </वाक्यविन्यास हाइलाइट>
टिप्पणियाँ
When compiled using gcc, the compiler reports:
$ 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'
$
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:
$ ./a.out
Recipient says hello!
श्रेणियाँ
ऑब्जेक्टिव-सी के डिजाइन के दौरान, मुख्य चिंताओं में से एक बड़े कोड आधारों की अनुरक्षणीयता थी। संरचित प्रोग्रामिंग दुनिया के अनुभव ने दिखाया था कि कोड को सुधारने के मुख्य तरीकों में से एक इसे छोटे टुकड़ों में तोड़ना था। ऑब्जेक्टिव-सी ने इस प्रक्रिया में मदद करने के लिए स्मॉलटाक कार्यान्वयन से श्रेणियों की अवधारणा को उधार लिया और विस्तारित किया।[25] इसके अतिरिक्त, किसी श्रेणी के तरीकों को रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम पर एक वर्ग में जोड़ा जाता है। इस प्रकार, श्रेणियां प्रोग्रामर को किसी वर्त्तमान वर्ग - एक ओपन क्लास (कंप्यूटर प्रोग्रामिंग) में विधियों को जोड़ने की अनुमति देती हैं - उस वर्ग को पुन: संकलित करने की आवश्यकता के बिना या इसके स्रोत कोड तक पहुंच भी। उदाहरण के लिए, यदि किसी सिस्टम में इसके स्ट्रिंग कार्यान्वयन में बानान चेकर नहीं है, तो इसे स्ट्रिंग स्रोत कोड को संशोधित किए बिना जोड़ा जा सकता है।
जब प्रोग्राम चलाया जाता है तो श्रेणियों के अन्दर के तरीके एक वर्ग के तरीकों से अप्रभेद्य हो जाते हैं। एक श्रेणी के पास निजी चर सहित कक्षा के अन्दर सभी इंस्टेंस चरों तक पूर्ण पहुंच होती है।
यदि कोई श्रेणी किसी वर्ग में वर्त्तमान विधि के समान विधि हस्ताक्षर के साथ एक विधि घोषित करती है, तो श्रेणी की विधि अपनाई जाती है। इस प्रकार श्रेणियां न केवल एक वर्ग में विधियाँ जोड़ सकती हैं, बल्कि वर्त्तमान विधियों को भी प्रतिस्थापित कर सकती हैं। इस सुविधा का उपयोग अन्य कक्षाओं में उनके तरीकों को फिर से लिखकर बग को ठीक करने के लिए किया जा सकता है, या किसी प्रोग्राम के अन्दर कक्षा के व्यवहार में वैश्विक परिवर्तन का कारण बन सकता है। यदि दो श्रेणियों में एक ही नाम के तरीके हैं लेकिन अलग-अलग विधि हस्ताक्षर हैं, तो यह अपरिभाषित है कि किस श्रेणी की विधि को अपनाया गया है।
अन्य भाषाओं ने इस सुविधा को विभिन्न तरीकों से जोड़ने का प्रयास किया है। TOM (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज) ने ऑब्जेक्टिव-सी सिस्टम को एक कदम आगे बढ़ाया और वेरिएबल्स को भी जोड़ने की अनुमति दी। अन्य भाषाओं ने इसके बजाय प्रोटोटाइप-आधारित प्रोग्रामिंग|प्रोटोटाइप-आधारित समाधानों का उपयोग किया है, सबसे उल्लेखनीय स्वयं (प्रोग्रामिंग भाषा) है।
C# और Visual Basic.NET भाषाएँ विस्तार विधियों के रूप में सतही रूप से समान कार्यक्षमता को प्रयुक्त करती हैं, लेकिन इनमें कक्षा के निजी चरों तक पहुँच की कमी होती है।[26] रूबी (प्रोग्रामिंग भाषा) और कई अन्य गतिशील प्रोग्रामिंग भाषाएं तकनीक को बंदर पैचिंग के रूप में संदर्भित करती हैं।
लॉगटॉक श्रेणियों की एक अवधारणा को प्रयुक्त करता है (प्रथम-श्रेणी की संस्थाओं के रूप में) जो ऑब्जेक्टिव-सी श्रेणियों की कार्यक्षमता को कम करता है (लॉगटॉक श्रेणियों को रचना की ठीक-ठाक इकाइयों के रूप में भी इस्तेमाल किया जा सकता है, उदाहरण के लिए नई कक्षाएं या प्रोटोटाइप; विशेष रूप से, एक लॉगटॉक श्रेणी हो सकती है। वस्तुतः किसी भी वर्ग और प्रोटोटाइप द्वारा आयात किया जाता है)।
श्रेणियों का उदाहरण उपयोग
यह उदाहरण एक बनाता है Integer कक्षा, पहले एक बुनियादी वर्ग को केवल विधि (कंप्यूटर विज्ञान) के साथ परिभाषित करके, और दो श्रेणियों को जोड़कर, Arithmetic और Display, जो मूल वर्ग का विस्तार करते हैं। जबकि श्रेणियां बेस क्लास के निजी डेटा सदस्यों तक पहुंच सकती हैं, इन निजी डेटा सदस्यों को एक्सेसर विधियों के माध्यम से एक्सेस करना अक्सर अच्छा अभ्यास होता है, जो श्रेणियों को बेस क्लास से अधिक स्वतंत्र रखने में मदद करता है। ऐसे एक्सेसर्स को प्रयुक्त करना श्रेणियों का एक विशिष्ट उपयोग है। दूसरा आधार वर्ग में विधियों को जोड़ने के लिए श्रेणियों का उपयोग करना है। चुकी, इसे उपवर्ग ओवरराइडिंग के लिए श्रेणियों का उपयोग करने के लिए अच्छा अभ्यास नहीं माना जाता है, जिसे मंकी पैचिंग भी कहा जाता है। अनौपचारिक प्रोटोकॉल को आधार पर एक श्रेणी के रूप में प्रयुक्त किया जाता है NSObject कक्षा। परिपाटी के अनुसार, बेस क्लास का विस्तार करने वाली श्रेणियों वाली फाइलों का नाम BaseClass+ExtensionClass.h होगा।
- पूर्णांक। एच
- <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात <objc/Object.h>
@इंटरफेस इंटीजर: ऑब्जेक्ट {
इंट पूर्णांक;
}
- (इंट) पूर्णांक; - (आईडी) पूर्णांक: (इंट) _ पूर्णांक; @अंत </वाक्यविन्यास हाइलाइट>
- पूर्णांक.एम
- <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- आयात पूर्णांक.एच
@कार्यान्वयन पूर्णांक - (इंट) पूर्णांक {
वापसी पूर्णांक;
}
- (आईडी) पूर्णांक: (इंट) _पूर्णांक {
पूर्णांक = _पूर्णांक; स्वयं लौटें;
} @अंत </वाक्यविन्यास हाइलाइट>
- पूर्णांक+अंकगणित.एच
- <वाक्यविन्यास लैंग = ओबीजेसी>
- आयात पूर्णांक.एच
@interface पूर्णांक (अंकगणित) - (आईडी) जोड़ें: (पूर्णांक *) जोड़; - (आईडी) उप: (पूर्णांक *) सबट्रेंड; @अंत </वाक्यविन्यास हाइलाइट>
- पूर्णांक+अंकगणित.m
- <वाक्यविन्यास लैंग = ओबीजेसी>
- आयात पूर्णांक+अंकगणित.एच
@कार्यान्वयन पूर्णांक (अंकगणित) - (आईडी) जोड़ें: (पूर्णांक *) जोड़ {
वापसी [स्वयं पूर्णांक: [स्वयं पूर्णांक] + [पूर्णांक जोड़ें;
}
- (आईडी) उप: (पूर्णांक *) सबट्रेंड {
वापसी [स्वयं पूर्णांक: [स्वयं पूर्णांक] - [सबट्रेंड पूर्णांक;
} @अंत </वाक्यविन्यास हाइलाइट>
- पूर्णांक+डिस्प्ले.एच
- <वाक्यविन्यास लैंग = ओबीजेसी>
- आयात पूर्णांक.एच
@interface पूर्णांक (प्रदर्शन) - (आईडी) शोस्टार; - (आईडी) दिखावा; @अंत </वाक्यविन्यास हाइलाइट>
- पूर्णांक+डिस्प्ले.एम
- <वाक्यविन्यास लैंग = ओबीजेसी>
- आयात पूर्णांक + प्रदर्शन। एच
@कार्यान्वयन पूर्णांक (प्रदर्शन) - (आईडी) शोस्टार {
int i, x = [स्वयं पूर्णांक]; के लिए (i = 0; i <x; i++) { प्रिंटफ (*); } प्रिंटफ (\n);
स्वयं लौटें;
}
- (आईडी) दिखाना {
प्रिंटफ (% डी \ n, [स्वयं पूर्णांक]);
स्वयं लौटें;
} @अंत </वाक्यविन्यास हाइलाइट>
- मुख्य.एम
- <वाक्यविन्यास लैंग = ओबीजेसी लाइन>
- आयात पूर्णांक.एच
- आयात पूर्णांक+अंकगणित.एच
- आयात पूर्णांक+प्रदर्शन.एच
पूर्णांक मुख्य (शून्य) {
पूर्णांक * अंक 1 = [पूर्णांक नया], * अंक 2 = [पूर्णांक नया]; इंट एक्स;
प्रिंटफ (एक पूर्णांक दर्ज करें:); स्कैनफ (% डी, & एक्स);
[संख्या 1 पूर्णांक: x]; [संख्या 1 शोस्टार्स];
प्रिंटफ (एक पूर्णांक दर्ज करें:); स्कैनफ (% डी, & एक्स);
[संख्या 2 पूर्णांक: x]; [संख्या 2 शोस्टार्स];
[संख्या 1 जोड़ें: संख्या 2]; [संख्या 1 प्रदर्शन];
वापसी 0;
} </वाक्यविन्यास हाइलाइट>
टिप्पणियाँ
Compilation is performed, for example, by:
$ gcc -x objective-c main.m Integer.m Integer+Arithmetic.m Integer+Display.m -lobjc
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 ([कस्टमएनएसएप्लीकेशन क्लास], [एनएसएप्लीकेशन क्लास]); </वाक्यविन्यास हाइलाइट>
यह सेटमेनमेनू के एनएसएप्लिकेशंस के प्रत्येक आमंत्रण को रोकता है।
# आयात
सी भाषा में, #include
पूर्व-संकलन निर्देश हमेशा उस बिंदु पर फ़ाइल की सामग्री को स्रोत में डालने का कारण बनता है। ऑब्जेक्टिव-सी में है #import
निर्देश, समतुल्य सिवाय इसके कि प्रत्येक फ़ाइल को प्रति संकलन इकाई में केवल एक बार सम्मिलित किया जाता है, जिसमें गार्ड सम्मिलित करने की आवश्यकता को कम किया जाता है।
लिनक्स जीसीसी संकलन
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // फ़ाइल: हैलो.एम
- आयात <फाउंडेशन/फाउंडेशन.एच>
int main (int argc, const char * argv[]) {
/* ऑब्जेक्टिव-सी में मेरा पहला प्रोग्राम */ एनएसएलओजी (@ हैलो, वर्ल्ड! \n); वापसी 0;
}
</वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास लैंग = शेल-सत्र> $ # gcc और MinGW कंपाइलर के लिए कंपाइल कमांड लाइन: $ जीसीसी \
$(gnusstep-config --objc-flags) \ -ओ हैलो \ हेलो.एम \ -एल /जीएनयूस्टेप/सिस्टम/लाइब्रेरी/लाइब्रेरी \ -लोबजेसी \ -lgnustep-आधार
$ ./नमस्ते </वाक्यविन्यास हाइलाइट>
अन्य विशेषताएं
ऑब्जेक्टिव-सी की विशेषताएं अक्सर प्रोग्रामिंग मुद्दों के लिए लचीले और अक्सर आसान समाधान की अनुमति देती हैं।
- श्रेणियों और संदेश अग्रेषण का उपयोग करके अन्य वस्तुओं और दूरस्थ प्रक्रिया कॉल के लिए प्रतिनिधि विधियों को आसानी से प्रयुक्त किया जा सकता है।
- isa पॉइंटर का सूचक झूल रहा है कक्षाओं को रनटाइम में बदलने की अनुमति देता है। सामान्यतः डिबगिंग के लिए उपयोग किया जाता है जहां मुक्त वस्तुओं को ज़ोंबी वस्तुओं में घुमा दिया जाता है जिसका एकमात्र उद्देश्य किसी त्रुटि की रिपोर्ट करना है जब कोई उन्हें कॉल करता है। स्विज़लिंग का उपयोग एंटरप्राइज़ ऑब्जेक्ट फ्रेमवर्क में डेटाबेस दोष बनाने के लिए भी किया गया था।[citation needed] की-वैल्यू ऑब्जर्विंग को प्रयुक्त करने के लिए एप्पल के फाउंडेशन फ्रेमवर्क द्वारा आज स्विज़लिंग का उपयोग किया जाता है।
भाषा प्रकार
उद्देश्य-सी ++
उद्देश्य सी++ GNU Compiler Collection और Clang के फ्रंट-एंड द्वारा स्वीकार किया गया एक भाषा संस्करण है, जो C++ और उद्देश्य सी सिंटैक्स के संयोजन का उपयोग करने वाली स्रोत फ़ाइलों को संकलित कर सकता है। ऑब्जेक्टिव-सी++ सी++ में वे एक्सटेंशन जोड़ता है जो ऑब्जेक्टिव-सी सी में जोड़ता है। जैसा कि विभिन्न भाषा सुविधाओं के पीछे शब्दार्थ को एकीकृत करने के लिए कुछ भी नहीं किया जाता है, कुछ प्रतिबंध प्रयुक्त होते हैं:
- एक सी ++ क्लास ऑब्जेक्टिव-सी क्लास से प्राप्त नहीं हो सकती है और इसके विपरीत।
- सी ++ नेमस्पेस को उद्देश्य-सी घोषणा के अंदर घोषित नहीं किया जा सकता है।
- उद्देश्य-सी घोषणाएं केवल वैश्विक दायरे में दिखाई दे सकती हैं, सी ++ नेमस्पेस के अंदर नहीं
- उद्देश्य-सी कक्षाओं में सी ++ कक्षाओं के आवृत्ति चर नहीं हो सकते हैं जिनमें डिफ़ॉल्ट कंस्ट्रक्टर की कमी है या जिनमें एक या अधिक वर्चुअल विधियां हैं,[citation needed] लेकिन सी ++ ऑब्जेक्ट्स के पॉइंटर्स को प्रतिबंध के बिना उदाहरण चर के रूप में उपयोग किया जा सकता है (उन्हें -इनिट विधि में नए के साथ आवंटित करें)।
- C++ by value semantics को उद्देश्य सी ऑब्जेक्ट्स पर प्रयुक्त नहीं किया जा सकता है, जो केवल पॉइंटर्स के माध्यम से एक्सेस किए जा सकते हैं।
- एक उद्देश्य-सी घोषणा सी ++ टेम्पलेट घोषणा के अन्दर नहीं हो सकती है और इसके विपरीत। चुकी, ऑब्जेक्टिव-सी टाइप (जैसे,
Classname *
) का उपयोग C++ टेम्पलेट पैरामीटर के रूप में किया जा सकता है। - ऑब्जेक्टिव-सी और सी++ एक्सेप्शन हैंडलिंग अलग है; प्रत्येक के संचालक दूसरे प्रकार के अपवादों को संभाल नहीं सकते। नतीजतन, वस्तु विनाशक नहीं चलाए जाते हैं। हाल के ऑब्जेक्टिव-सी 2.0 रनटाइम में इसे कम किया गया है क्योंकि ऑब्जेक्टिव-सी अपवादों को या तो पूरी तरह से (ऐप्पल रनटाइम) सी ++ अपवादों द्वारा प्रतिस्थापित किया जाता है, या आंशिक रूप से जब ऑब्जेक्टिव-सी ++ लाइब्रेरी जुड़ा हुआ है (जीएनयूस्टेप libobjc2)।[27]
- ऑब्जेक्टिव-सी ब्लॉक और C++11 बेनामी फंक्शन#C++ (C++11 के बाद से) अलग-अलग संस्थाएं हैं। हालाँकि, एक लैम्ब्डा पास करते समय मैक ओएस पर एक ब्लॉक पारदर्शी रूप से उत्पन्न होता है जहाँ एक ब्लॉक की उम्मीद होती है।[28]
उद्देश्य-सी 2.0
2006 के विश्वव्यापी डेवलपर्स सम्मेलन में, एप्पल ने उद्देश्य सी 2.0 को जारी करने की घोषणा की, उद्देश्य सी भाषा का एक संशोधन जिसमें आधुनिक कचरा संग्रह, सिंटैक्स संवर्द्धन,[29] रनटाइम प्रदर्शन में सुधार,[30] और 64-बिट समर्थन। Mac OS X v10.5, अक्टूबर 2007 में जारी किया गया, जिसमें एक ऑब्जेक्टिव-सी 2.0 कंपाइलर सम्मिलित था। GNU कम्पाइलर संग्रह|जीसीसी 4.6 कई नई ऑब्जेक्टिव-सी सुविधाओं का समर्थन करता है, जैसे कि घोषित और संश्लेषित गुण, डॉट सिंटैक्स, तेज़ गणना, वैकल्पिक प्रोटोकॉल विधियाँ, विधि/प्रोटोकॉल/क्लास विशेषताएँ, क्लास एक्सटेंशन, और एक नया GNU ऑब्जेक्टिव-सी रनटाइम एपीआई .[31] नामकरण ऑब्जेक्टिव-सी 2.0 भाषा के संस्करण प्रणाली में एक विराम का प्रतिनिधित्व करता है, क्योंकि नेक्स्ट के लिए अंतिम ऑब्जेक्टिव-सी संस्करण objc4 था।[32] इस प्रोजेक्ट का नाम Mac OS X Leopard (10.5) में लीगेसी ऑब्जेक्टिव-सी रनटाइम सोर्स कोड की पिछली रिलीज़ में रखा गया था।[33]
कचरा संग्रह
उद्देश्य-सी 2.0 ने एक वैकल्पिक रूढ़िवादी, पीढ़ीगत कचरा संग्रह (कंप्यूटर विज्ञान) प्रदान किया। जब बैकवर्ड-संगत मोड में चलाया जाता है, तो रनटाइम संदर्भ गिनती ऑपरेशंस जैसे रिटेन और रिलीज को नो-ऑप्स में बदल देता है। कचरा संग्रह सक्षम होने पर सभी ऑब्जेक्ट कचरा संग्रह के अधीन थे। अंतर्निहित राइट-बैरियर कंपाइलर इंटरसेप्ट्स को ट्रिगर करने के लिए नियमित सी पॉइंटर्स को __strong के साथ योग्य किया जा सकता है और इस प्रकार कचरा संग्रह में भाग लेते हैं।[34] एक शून्य-इंग कमजोर सबसिस्टम भी प्रदान किया गया था जैसे कि __weak के रूप में चिह्नित पॉइंटर्स शून्य पर सेट होते हैं जब ऑब्जेक्ट (या अधिक सरलता से, GC मेमोरी) एकत्र किया जाता है। ऑब्जेक्टिव-सी 2.0 के आईओएस कार्यान्वयन पर कचरा संग्रहकर्ता मौजूद नहीं है।[35] ऑब्जेक्टिव-सी में कचरा संग्रह कम प्राथमिकता वाले पृष्ठभूमि थ्रेड पर चलता है, और उपयोगकर्ता अनुभव को उत्तरदायी रखने के इरादे से उपयोगकर्ता ईवेंट पर रोक सकता है।[36] स्वचालित संदर्भ गणना (एआरसी) के पक्ष में मैक ओएस एक्स v10.8 में कचरा संग्रह बहिष्कृत किया गया था।[37] ARM64 पर चल रहे iOS 7 पर उद्देश्य सी 64-बिट शब्द में से 19 बिट्स का उपयोग रेफरेंस काउंट को टैग किए गए पॉइंटर्स के रूप में स्टोर करने के लिए करता है।[38][39]
गुण
ऑब्जेक्टिव-सी 2.0 ऐक्सेसर विधियों की पीढ़ी को कॉन्फ़िगर करने के लिए वैकल्पिक विशेषताओं के साथ संपत्ति (प्रोग्रामिंग) के रूप में उदाहरण चर घोषित करने के लिए एक नया सिंटैक्स पेश करता है। गुण, एक अर्थ में, सार्वजनिक उदाहरण चर हैं; यानी, एक संपत्ति के रूप में एक उदाहरण चर घोषित करना उस संपत्ति के लिए बाहरी कक्षाओं को पहुंच प्रदान करता है (संभवतः सीमित, उदाहरण के लिए केवल पढ़ने के लिए)। एक संपत्ति को केवल पढ़ने के लिए घोषित किया जा सकता है, और भंडारण शब्दार्थ जैसे कि प्रदान किया जा सकता है assign
, copy
या retain
. डिफ़ॉल्ट रूप से, गुणों पर विचार किया जाता है atomic
, जिसके परिणामस्वरूप एक ही समय में कई थ्रेड्स को एक्सेस करने से रोकने वाला लॉक हो जाता है। एक संपत्ति के रूप में घोषित किया जा सकता है nonatomic
, जो इस लॉक को हटा देता है।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @इंटरफेस व्यक्ति: एनएसओब्जेक्ट { @जनता
एनएसएसटींग * नाम;
@निजी
अंतर आयु;
}
@ संपत्ति (प्रतिलिपि) एनएसएसटींग * नाम; @ संपत्ति (आसानी से) int उम्र;
- (आईडी) initWithAge: (int) उम्र; @अंत </वाक्यविन्यास हाइलाइट>
गुणों के माध्यम से कार्यान्वित किया जाता है @synthesize
कीवर्ड, जो संपत्ति घोषणा के अनुसार गेट्टर (और सेटर, यदि केवल पढ़ने के लिए नहीं) तरीके उत्पन्न करता है। वैकल्पिक रूप से, गेट्टर और सेटर विधियों को स्पष्ट रूप से प्रयुक्त किया जाना चाहिए, या @dynamic
कीवर्ड का उपयोग यह इंगित करने के लिए किया जा सकता है कि एक्सेसर विधियां अन्य माध्यमों से प्रदान की जाएंगी। जब क्लैंग 3.1 या उच्चतर का उपयोग करके संकलित किया जाता है, तो सभी गुण जिन्हें स्पष्ट रूप से घोषित नहीं किया जाता है @dynamic
, चिह्नित readonly
या पूर्ण उपयोगकर्ता-कार्यान्वित गेट्टर है और सेटर स्वचालित रूप से निहित होगा @synthesize
'डी।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @ कार्यान्वयन व्यक्ति @संश्लेषित नाम;
- (आईडी) 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-बिट मैक ओएस और सभी iOS के लिए बिल्डिंग कोड होता है)। आधुनिक रनटाइम के अनुसार, इंस्टेंस वेरिएबल एक्सेस में इंडिकेशन की एक अतिरिक्त परत जोड़ी जाती है, जिससे डायनेमिक लिंकर को रनटाइम पर इंस्टेंस लेआउट को समायोजित करने की अनुमति मिलती है। यह सुविधा ऑब्जेक्टिव-सी कोड में दो महत्वपूर्ण सुधारों की अनुमति देती है:
- यह नाजुक बाइनरी इंटरफ़ेस समस्या को समाप्त करता है; सुपरक्लास बाइनरी संगतता को प्रभावित किए बिना आकार बदल सकते हैं।
- यह इंस्टेंस वेरिएबल्स की अनुमति देता है जो गुणों को क्लास के इंटरफ़ेस में घोषित किए बिना रनटाइम पर संश्लेषित करने के लिए समर्थन प्रदान करते हैं।
फास्ट गणना
एक संग्रह के माध्यम से पुनरावृत्ति करने के लिए NSEnumerator ऑब्जेक्ट या इंडेक्स का उपयोग करने के बजाय, ऑब्जेक्टिव-सी 2.0 तेज़ गणना सिंटैक्स प्रदान करता है। ऑब्जेक्टिव-सी 2.0 में, निम्नलिखित लूप कार्यात्मक रूप से समकक्ष हैं, लेकिन अलग-अलग प्रदर्शन गुण हैं।
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // एनएसईन्यूमेरेटर का उपयोग करना NSEnumerator *गणक = [पीपुल ऑब्जेक्टएन्यूमरेटर]; व्यक्ति *पी;
जबकि ((पी = [एन्यूमरेटर नेक्स्टऑब्जेक्ट])! = शून्य) {
NSLog(@ %@% i साल पुराना है। , [पी नाम], [पी उम्र]);
} </वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // इंडेक्स का उपयोग करना के लिए (int i = 0; i <[लोग गिनती]; i++) {
व्यक्ति * पी = [पीपल ऑब्जेक्ट एट इंडेक्स: आई]; NSLog(@ %@% i साल पुराना है। , [पी नाम], [पी उम्र]);
} </वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> // तेज गणना का उपयोग करना for (Person *p in thePeople) {
NSLog(@ %@% i साल पुराना है। , [पी नाम], [पी उम्र]);
} </वाक्यविन्यास हाइलाइट>
तेज़ गणना मानक गणना की तुलना में अधिक कुशल कोड उत्पन्न करती है क्योंकि वस्तुओं पर गणना करने के लिए विधि कॉल को NSFastEnumeration प्रोटोकॉल का उपयोग करके पॉइंटर अंकगणित द्वारा प्रतिस्थापित किया जाता है।[40]
कक्षा विस्तार
एक वर्ग विस्तार में एक श्रेणी घोषणा के समान सिंटैक्स होता है जिसमें कोई श्रेणी नाम नहीं होता है, और इसमें घोषित विधियों और गुणों को सीधे मुख्य वर्ग में जोड़ा जाता है। यह अधिकांशतः सार्वजनिक शीर्षकों में विज्ञापन के बिना एक वर्ग में विधियों को जोड़ने के लिए एक श्रेणी के विकल्प के रूप में उपयोग किया जाता है, इस लाभ के साथ कि वर्ग विस्तार के लिए संकलक जाँच करता है कि सभी निजी तौर पर घोषित तरीके वास्तव में प्रयुक्त किए गए हैं।[41]
कोको के विकास के लिए निहितार्थ
This section does not cite any sources. (November 2012) (Learn how and when to remove this template message) |
MacOS के लिए विकसित सभी ऑब्जेक्टिव-सी एप्लिकेशन जो ऑब्जेक्टिव-सी 2.0 के लिए उपरोक्त सुधारों का उपयोग करते हैं, 10.5 (तेंदुए) से पहले के सभी ऑपरेटिंग सिस्टम के साथ असंगत हैं। चूँकि तेज़ गणना मानक गणना के समान बायनेरिज़ उत्पन्न नहीं करती है, इसके उपयोग से मैक ओएस एक्स संस्करण 10.4 या इससे पहले के संस्करण क्रैश हो जाएंगे।
ब्लॉक
ब्लॉक उद्देश्य-सी (और सी (प्रोग्रामिंग भाषा) और सी ++) के लिए एक गैर-मानक विस्तार है जो क्लोजर (प्रोग्रामिंग) बनाने के लिए विशेष सिंटैक्स का उपयोग करता है। ब्लॉक केवल Mac OS X स्नो लेपर्ड|Mac OS X 10.6 स्नो लेपर्ड या बाद के संस्करण, iOS 4 या उसके बाद के संस्करण, और libobjc2 1.7 के साथ GNUstep और क्लैंग 3.1 या बाद के संस्करण के साथ संकलन में समर्थित हैं।[42] <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- सम्मिलित <stdio.h>
- सम्मिलित <Block.h>
टाइपपीफ इंट (^ इंटब्लॉक) ();
इंटब्लॉक मेककाउंटर (इंट स्टार्ट, इंट इंक्रीमेंट) {
__ ब्लॉक इंट आई = स्टार्ट;
रिटर्न ब्लॉक_कॉपी ( ^ { int ret = मैं; मैं + = वेतन वृद्धि; वापसी रिट; });
}
पूर्णांक मुख्य (शून्य) {
इंटब्लॉक मायकाउंटर = मेककाउंटर (5, 2); प्रिंटफ (पहली कॉल:% d \ n, मायकाउंटर ()); प्रिंटफ (दूसरा कॉल:% d \ n, मायकाउंटर ()); प्रिंटफ (तीसरा कॉल:% d \ n, मायकाउंटर ());
/ * क्योंकि इसकी नकल की गई थी, इसे भी जारी किया जाना चाहिए * / ब्लॉक_रिलीज़ (मायकाउंटर);
वापसी 0;
} / * आउटपुट:
पहली कॉल: 5 दूसरी कॉल: 7 तीसरी कॉल: 9
- /
</वाक्यविन्यास हाइलाइट>
आधुनिक उद्देश्य-सी
एप्पल ने समय के साथ ऑब्जेक्टिव 2.0 में कुछ अतिरिक्त सुविधाएँ जोड़ी हैं। जोड़ केवल एप्पल LLVM कंपाइलर पर प्रयुक्त होते हैं, यानी भाषा का क्लैंग फ्रंटएंड। भ्रामक रूप से, एप्पल द्वारा उपयोग किया जाने वाला संस्करण LLVM अपस्ट्रीम से भिन्न होता है; को देखें Xcode § Toolchain versions ओपन-सोर्स एलएलवीएम संस्करण संख्या में अनुवाद के लिए।[43]
स्वचालित संदर्भ गणना
ऑटोमैटिक रेफरेंस काउंटिंग (ARC) एक कंपाइल-टाइम फीचर है जो प्रोग्रामर्स को मैन्युअल रूप से रिटेन काउंट्स को मैनेज करने की जरूरत को खत्म करता है retain
और release
.[44] कचरा संग्रह (कंप्यूटर विज्ञान) के विपरीत, जो रन टाइम पर होता है, एआरसी एक अलग प्रक्रिया के ऊपरी हिस्से को बनाए रखने की गिनती को प्रबंधित करता है। एआरसी और मैनुअल मेमोरी प्रबंधन परस्पर अनन्य नहीं हैं; प्रोग्रामर एआरसी-सक्षम परियोजनाओं में व्यक्तिगत कोड फ़ाइलों के लिए एआरसी को अक्षम करके गैर-एआरसी कोड का उपयोग करना जारी रख सकते हैं। Xcode किसी प्रोजेक्ट को स्वचालित रूप से ARC में अपग्रेड करने का प्रयास कर सकता है।
एआरसी को एलएलवीएम 3.0 में पेश किया गया था। यह Xcode 4.2 (2011), या एप्पल LLVM कंपाइलर 3.0 में अनुवाद करता है।[45]
शाब्दिक
नेक्स्ट और एप्पल Obj-C रनटाइम में लंबे समय से शाब्दिक सिंटैक्स का उपयोग करके नए तार बनाने का एक छोटा-सा तरीका सम्मिलित है @"a new string"
, या CoreFoundation स्थिरांक पर ड्रॉप करें kCFBooleanTrue
और kCFBooleanFalse
के लिए NSNumber
बूलियन मूल्यों के साथ। इस प्रारूप का उपयोग करने से प्रोग्रामर को अधिक समय तक उपयोग करने से बचाया जाता है initWithString
या इसी तरह के तरीके कुछ संचालन करते समय।
एप्पल LLVM कंपाइलर 4.0 (Xcode 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]; </वाक्यविन्यास हाइलाइट>
शाब्दिक के साथ उदाहरण:
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> एनएसएआरएआरई * 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; </वाक्यविन्यास हाइलाइट>
हालाँकि, स्ट्रिंग शाब्दिक से भिन्न, जो निष्पादन योग्य में स्थिरांक के लिए संकलित होते हैं, ये शाब्दिक उपरोक्त विधि कॉल के समतुल्य कोड के लिए संकलित होते हैं। विशेष रूप से, मैन्युअल रूप से संदर्भ-गणना स्मृति प्रबंधन के अनुसार, इन वस्तुओं को स्वत: रिलीज़ किया जाता है, जिसके लिए अतिरिक्त देखभाल की आवश्यकता होती है, उदाहरण के लिए, फलन-स्थैतिक चर या अन्य प्रकार के ग्लोबल्स के साथ उपयोग किया जाता है।
सब्सक्रिप्शन
एप्पल LLVM कंपाइलर 4.0 या बाद के संस्करण का उपयोग करते समय, सरणियाँ और शब्दकोश (NSArray
और NSDictionary
क्लासेस) सबस्क्रिप्टिंग का उपयोग करके हेरफेर किया जा सकता है। वस्तुओं को अनुक्रमणिका या कुंजियों पर सेट करने के लिए। कोड में, कोष्ठकों का उपयोग करके सबस्क्रिप्टिंग का प्रतिनिधित्व किया जाता है [ ]
.[46]
सबस्क्रिप्टिंग के बिना उदाहरण:
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> आईडी ऑब्जेक्ट 1 = [कुछ ऐरे ऑब्जेक्टएट इंडेक्स: 0]; आईडी ऑब्जेक्ट 2 = [कुछ डिक्शनरी ऑब्जेक्टफॉरकी: @ कुंजी]; [someMutableArray की जगहObjectAtIndex:0 withObject:object3]; [someMutableDictionary setObject: object4 forKey:@ key]; </वाक्यविन्यास हाइलाइट>
सबस्क्रिप्टिंग के साथ उदाहरण:
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> आईडी ऑब्जेक्ट 1 = कुछ ऐरे [0]; आईडी ऑब्जेक्ट 2 = कुछ डिक्शनरी [@ कुंजी]; someMutableArray[0] = object3; कुछ म्यूटेबल डिक्शनरी [@ कुंजी] = ऑब्जेक्ट 4; </वाक्यविन्यास हाइलाइट>
आधुनिक ऑब्जेक्टिव-सी सिंटैक्स (1997)
एप्पल द्वारा नेक्स्ट की खरीद के बाद, स्मॉलटाक की तुलना में जावा (प्रोग्रामिंग भाषा) से अधिक परिचित प्रोग्रामर्स के लिए भाषा को अधिक स्वीकार्य बनाने का प्रयास किया गया। इन प्रयासों में से एक उस समय का परिचय देना था जिसे उस समय ऑब्जेक्टिव-सी के लिए मॉडर्न सिंटैक्स करार दिया गया था[47] (वर्तमान, क्लासिक सिंटैक्स के विपरीत)। व्यवहार में कोई बदलाव नहीं आया, यह केवल एक वैकल्पिक वाक्य-विन्यास था। एक विधि आमंत्रण लिखने के बजाय जैसे
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
वस्तु = MyClass आवंटन] init]; [ऑब्जेक्ट फर्स्ट लेबल: पैराम 1 सेकेंड लेबल: पैराम 2];
</वाक्यविन्यास हाइलाइट>
इसके बजाय इसे लिखा गया था
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
वस्तु = (MyClass.alloc).init; ऑब्जेक्ट.लेबल ( param1, param2 );
</वाक्यविन्यास हाइलाइट>
इसी तरह, घोषणाएं फॉर्म से चली गईं
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (शून्य) पहला लेबल: (int) param1 दूसरा लेबल: (int) param2;
</वाक्यविन्यास हाइलाइट>
को
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
- (शून्य) लेबल ( int param1, int param2 );
</वाक्यविन्यास हाइलाइट>
यह आधुनिक सिंटैक्स अब उद्देश्य सी भाषा की वर्तमान बोलियों में समर्थित नहीं है।
मूल-objc
[1] प्रोजेक्ट ऑब्जेक्टिव-सी का एक और री-इम्प्लीमेंटेशन है। यह बैकएंड के रूप में जीएनयू कंपाइलर संग्रह या क्लैंग/एलएलवीएम कंपाइलर्स का समर्थन करता है। यह सिंटैक्स, शब्दार्थ और ABI संगतता के संदर्भ में अन्य रनटाइम से अलग हो जाता है। यह Linux, FreeBSD और Windows को सपोर्ट करता है।
पोर्टेबल ऑब्जेक्ट कंपाइलर
जीएनयू कंपाइलर कलेक्शन/नेक्स्ट/एप्पल इंक. कार्यान्वयन के अतिरिक्त, जिसने मूल स्टेपस्टोन कार्यान्वयन में कई एक्सटेंशन जोड़े, एक और फ्री और ओपन सोर्स सॉफ्टवेयर | फ्री, ओपन-सोर्स ऑब्जेक्टिव-सी कार्यान्वयन जिसे पोर्टेबल ऑब्जेक्ट कंपाइलर कहा जाता है, भी मौजूद है।[48] पोर्टेबल ऑब्जेक्ट कंपाइलर द्वारा प्रयुक्त किए गए एक्सटेंशन का सेट जीसीसी/नेक्स्ट/एप्पल कार्यान्वयन से अलग है; विशेष रूप से, इसमें ऑब्जेक्टिव-सी के लिए स्मॉलटाक जैसे ब्लॉक सम्मिलित हैं, जबकि इसमें प्रोटोकॉल और श्रेणियों की कमी है, ओपनस्टेप और इसके डेरिवेटिव और रिश्तेदार में बड़े पैमाने पर उपयोग की जाने वाली दो विशेषताएं। कुल मिलाकर, पीओसी भाषा के विकास में एक पुराने, पूर्व-नेक्स्ट चरण का प्रतिनिधित्व करता है, जो मोटे तौर पर ब्रैड कॉक्स की 1991 की किताब के अनुरूप है।
इसमें ऑब्जेक्टपैक नामक एक रनटाइम लाइब्रेरी भी सम्मिलित है, जो कॉक्स की मूल ICPak101 लाइब्रेरी पर आधारित है (जो बदले में स्मॉलटाक -80 क्लास लाइब्रेरी से प्राप्त होती है), और ओपनस्टेप फाउंडेशनकिट से काफी अलग है।
जीईओएस उद्देश्य-सी
GEOS (16-बिट ऑपरेटिंग सिस्टम) सिस्टम एक प्रोग्रामिंग भाषा का उपयोग करता है जिसे GEOS उद्देश्य सी या goc के रूप में जाना जाता है;[49] नाम की समानता के बावजूद, दो भाषाएँ केवल समग्र अवधारणा में समान हैं और @ चिन्ह के साथ उपसर्ग वाले कीवर्ड का उपयोग करती हैं।
बजना
क्लैंग कंपाइलर सूट, एलएलवीएम प्रोजेक्ट का भाग, ऑब्जेक्टिव-सी और अन्य भाषाओं को प्रयुक्त करता है। जीसीसी 4.3 (2008) के GPLv3 में बदलने के बाद, एप्पल ने क्लैंग के पक्ष में इसे छोड़ दिया, एक कंपाइलर जिसके पास संशोधित करने के लिए अधिक कानूनी शक्ति है। नतीजतन, आधुनिक ऑब्जेक्टिव-सी भाषा की कई विशेषताएं केवल क्लैंग द्वारा समर्थित हैं।
अपने क्लैंग-आधारित एलएलवीएम कंपाइलर के लिए ऐप्पल की वर्जनिंग स्कीम एलएलवीएम के ओपन-सोर्स वर्जनिंग से अलग है। देखना Xcode § Toolchain versions एक अनुवाद के लिए[43]
जीएनयू, जीएनयूस्टेप, और विनओबीजेसी
GNU प्रोजेक्ट, लंबे समय से, नेक्स्ट और Obj-C प्रोग्राम को पोर्ट करने के लिए एक प्लेटफॉर्म में रुचि रखता है। के लिए चेंजलॉग libobjc जीसीसी में निर्देशिका से पता चलता है कि यह 1998 (जीसीसी 2.95) से पहले अस्तित्व में था, और इसके रीडमे ने 1993 (जीसीसी 2.4) में एक पुनर्लेखन पर आगे इशारा किया।[50] नेक्स्ट फ्रंटएंड सोर्स कोड जारी किया गया था क्योंकि इसे जीसीसी के हिस्से के रूप में बनाया गया था, GNU पब्लिक लाइसेंस जारी किया गया था जो ऐसा करने के लिए व्युत्पन्न कार्यों को करने के लिए मजबूर करता है।[when?] एप्पल ने 4.2.1 तक जीसीसी के अपने फोर्क को जारी करने में इस परंपरा को जारी रखा, जिसके बाद उन्होंने कंपाइलर को छोड़ दिया। जीसीसी अनुरक्षकों ने परिवर्तनों को स्वीकार किया, लेकिन ऑब्जेक्टिव-सी 2.0 भाषा जैसी नई सुविधाओं का समर्थन करने में ज्यादा निवेश नहीं किया।[32]: Which compiler नई भाषा में रुचि रखने वाले जीएनयूस्टेप डेवलपर्स ने जीसीसी को फोर्क किया libobjc जीसीसी से स्वतंत्र एक परियोजना के लिए कहा जाता है libobjc2 2009 में। उन्होंने नई भाषा सिंटैक्स का लाभ उठाने के लिए क्लैंग के साथ रनटाइम के उपयोग की भी व्यवस्था की।[32]: Which compiler जीसीसी एक ही समय में धीरे-धीरे चला गया, लेकिन जीसीसी 4.6.0 (2011) में वे ऑब्जेक्टिव-सी 2.0 पर अपने libobjc में भी चले गए हैं।[31][51] जीएनयूस्टेप प्रलेखन सुझाव देता है कि जीसीसी कार्यान्वयन में अभी भी ब्लॉक, गैर-नाजुक चर और नए एआरसी के लिए समर्थन की कमी है।[32]: Which runtime माइक्रोसॉफ्ट कांटा libobjc2 2015 में WinObjC के एक हिस्से में, यूनिवर्सल विंडोज प्लेटफॉर्म के लिए आईओएस ब्रिज। कोको टच और अंतर्निहित एपीआई के अपने स्वयं के कार्यान्वयन के साथ संयुक्त, परियोजना यूडब्ल्यूपी ऐप्स के अंदर आईओएस एप्लिकेशन कोड के पुन: उपयोग की अनुमति देती है।[52] विंडोज़ पर, उद्देश्य-सी विकास उपकरण जीएनयूस्टेप की वेबसाइट पर डाउनलोड करने के लिए प्रदान किए जाते हैं। GNUStep डेवलपमेंट सिस्टम में निम्नलिखित पैकेज होते हैं: GNUstep MinGW सिस्टम, GNUstep Core, GNUstep Devel, GNUstep Cairo, ProjectCenter IDE (Xcode की तरह, लेकिन उतना जटिल नहीं), Gorm (इंटरफ़ेस बिल्डर लाइक Xcode NIB बिल्डर)। ये बाइनरी इंस्टॉलर 2016 से अपडेट नहीं किए गए हैं,[53] इसलिए इसके बजाय Cygwin या MSYS2 के अनुसार निर्माण करके स्थापित करना एक बेहतर विचार हो सकता है।
लाइब्रेरी का उपयोग
ऑब्जेक्टिव-सी आज अक्सर मानक वस्तुओं (अक्सर किट या फ्रेमवर्क के रूप में जाना जाता है), जैसे कोको (एपीआई), जीएनयूस्टेप या ओबीजेएफडब्ल्यू की एक निश्चित लाइब्रेरी के साथ मिलकर प्रयोग किया जाता है। ये पुस्तकालय अक्सर ऑपरेटिंग सिस्टम के साथ आते हैं: जीएनयूस्टेप पुस्तकालय अक्सर लिनक्स-आधारित वितरण के साथ आते हैं और कोको मैकोज़ के साथ आता है। प्रोग्रामर को वर्त्तमान बेस क्लास (NSObject / OFObject) से कार्यक्षमता प्राप्त करने के लिए मजबूर नहीं किया जाता है। ऑब्जेक्टिव-सी नई रूट कक्षाओं की घोषणा के लिए अनुमति देता है जो किसी भी वर्त्तमान कार्यक्षमता को प्राप्त नहीं करते हैं। मूल रूप से, ऑब्जेक्टिव-सी-आधारित प्रोग्रामिंग वातावरण ने सामान्यतः ऑब्जेक्ट क्लास को बेस क्लास के रूप में पेश किया, जिससे लगभग सभी अन्य वर्ग विरासत में मिले। ओपनस्टेप की प्रारंभआत के साथ, नेक्स्ट ने एनएसओब्जेक्ट नामक एक नया बेस क्लास बनाया, जिसने ऑब्जेक्ट पर अतिरिक्त सुविधाओं की पेशकश की (उदाहरण के लिए कच्चे पॉइंटर्स के बजाय ऑब्जेक्ट रेफरेंस और रेफरेंस काउंटिंग का उपयोग करने पर जोर)। कोको में लगभग सभी वर्ग एनएसओब्जेक्ट से प्राप्त होते हैं।
नामकरण ने न केवल ओपनस्टेप एपीआई के अन्दर कक्षाओं के नए डिफ़ॉल्ट व्यवहार को अलग करने के लिए काम किया, बल्कि इसने कोड की अनुमति दी जो ऑब्जेक्ट का उपयोग करता था - मूल बेस क्लास जो नेक्स्टस्टेप (और, कम या ज्यादा, अन्य ऑब्जेक्टिव-सी क्लास लाइब्रेरी) पर उपयोग किया जाता था। एनएसओब्जेक्ट (कुछ सीमाओं के साथ) का उपयोग करने वाले कोड के साथ एक ही रनटाइम में सह-अस्तित्व में है। दो अक्षर के उपसर्ग का परिचय भी नामस्थानों का एक सरलीकृत रूप बन गया, जिसमें ऑब्जेक्टिव-सी का अभाव है। एक अनौपचारिक पैकेजिंग पहचानकर्ता बनाने के लिए एक उपसर्ग का उपयोग ऑब्जेक्टिव-सी समुदाय में एक अनौपचारिक कोडिंग मानक बन गया, और आज भी जारी है।
अभी हाल ही में, पैकेज प्रबंधक दिखाई देने लगे हैं, जैसे कि CocoaPods, जिसका उद्देश्य पैकेज प्रबंधक और पैकेजों का भंडार दोनों बनना है। बहुत सारे ओपन-सोर्स ऑब्जेक्टिव-सी कोड जो पिछले कुछ वर्षों में लिखे गए थे, अब CocoaPods का उपयोग करके इंस्टॉल किए जा सकते हैं।
भाषा का विश्लेषण
This section needs additional citations for verification. (December 2011) (Learn how and when to remove this template message) |
उद्देश्य-सी कार्यान्वयन सी में लिखे गए पतले रन टाइम सिस्टम का उपयोग करते हैं[citation needed], जो एप्लिकेशन के आकार में बहुत कम जोड़ता है। इसके विपरीत, अधिकांश ऑब्जेक्ट-ओरिएंटेड सिस्टम जब इसे बनाया गया था तब बड़े आभासी मशीन रनटाइम का उपयोग किया गया था। ऑब्जेक्टिव-सी में लिखे गए प्रोग्राम उनके कोड के आकार और पुस्तकालयों के आकार से बहुत बड़े नहीं होते हैं (जिन्हें सामान्यतः पर सॉफ़्टवेयर वितरण में सम्मिलित करने की आवश्यकता नहीं होती है), स्मॉलटाक सिस्टम के विपरीत जहां बड़ी मात्रा में मेमोरी होती थी केवल एक विंडो खोलने के लिए उपयोग किया जाता है। ऑब्जेक्टिव-सी एप्लिकेशन समान सी या सी ++ एप्लिकेशन से बड़े होते हैं क्योंकि ऑब्जेक्टिव-सी डायनेमिक टाइपिंग तरीकों को अलग या इनलाइन करने की अनुमति नहीं देता है। चूंकि प्रोग्रामर के पास प्रत्यायोजित करने, कॉल को आगे बढ़ाने, फ्लाई पर चयनकर्ताओं का निर्माण करने और उन्हें रनटाइम सिस्टम में पास करने की ऐसी स्वतंत्रता है, इसलिए ऑब्जेक्टिव-सी कंपाइलर यह नहीं मान सकता है कि अप्रयुक्त तरीकों को हटाना या इनलाइन कॉल को सुरक्षित करना है।
इसी तरह, भाषा को वर्त्तमान सी कंपाइलर्स (जीएनयू कंपाइलर संग्रह में, पहले प्रीप्रोसेसर के रूप में, फिर मॉड्यूल के रूप में) के बजाय एक नए कंपाइलर के रूप में प्रयुक्त किया जा सकता है। यह ऑब्जेक्टिव-सी को सी कोड, लाइब्रेरी, टूल्स आदि के विशाल वर्त्तमान संग्रह का लाभ उठाने की अनुमति देता है। वर्त्तमान सी लाइब्रेरी को ओओ-स्टाइल इंटरफ़ेस प्रदान करने के लिए ऑब्जेक्टिव-सी एडेप्टर पैटर्न में लपेटा जा सकता है। इस पहलू में, यह GObject लाइब्रेरी और वाला (प्रोग्रामिंग भाषा) भाषा के समान है, जो जीटीके अनुप्रयोगों के विकास में व्यापक रूप से उपयोग की जाती हैं।
इन सभी व्यावहारिक परिवर्तनों ने प्रवेश की बाधाओं को कम कर दिया, संभवतः 1980 के दशक में स्मॉलटाक की व्यापक स्वीकृति के लिए सबसे बड़ी समस्या।
एक आम आलोचना यह है कि ऑब्जेक्टिव-सी में नाम स्थान के लिए भाषा समर्थन नहीं है। इसके बजाय, प्रोग्रामर को अपने वर्ग के नामों में उपसर्ग जोड़ने के लिए मजबूर किया जाता है, जो परंपरागत रूप से नाम स्थान के नाम से कम होते हैं और इस प्रकार टकराव के लिए अधिक प्रवण होते हैं। 2007 तक, कोको (सॉफ्टवेयर) प्रोग्रामिंग वातावरण में सभी मैक ओएस कक्षाएं और फलन NS (जैसे NSObject, NSButton) के साथ प्रीफ़िक्स्ड हैं ताकि उन्हें मैक ओएस या iOS कोर से संबंधित के रूप में पहचाना जा सके; NS, नेक्स्टSTEP के विकास के दौरान परिभाषित किए गए वर्गों के नामों से निकला है।
चूँकि उद्देश्य सी, C का एक सख्त सुपरसेट है, यह C आदिम प्रकारों को प्रथम श्रेणी की वस्तुओं के रूप में नहीं मानता है।
सी ++ के विपरीत, ऑब्जेक्टिव-सी ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है। सी ++ के विपरीत, ऑब्जेक्टिव-सी किसी ऑब्जेक्ट को सीधे केवल एक वर्ग से प्राप्त करने की अनुमति देता है (एकाधिक विरासत को रोकता है)। चुकी, अधिकांशतः स्थितियों में, समान परिणाम प्राप्त करने के वैकल्पिक तरीकों के रूप में श्रेणियों और प्रोटोकॉल का उपयोग किया जा सकता है।
चूंकि उद्देश्य-सी गतिशील रनटाइम टाइपिंग का उपयोग करता है और क्योंकि सभी विधि कॉल फलन कॉल (या, कुछ स्थितियों में, syscalls) हैं, कई सामान्य प्रदर्शन अनुकूलन उद्देश्य-सी विधियों पर प्रयुक्त नहीं किए जा सकते हैं (उदाहरण के लिए: इनलाइनिंग, निरंतर प्रचार, इंटरप्रोसेडुरल ऑप्टिमाइज़ेशन, और समुच्चय का अदिश प्रतिस्थापन)। यह सी ++ जैसी भाषाओं में समान सार के सापेक्ष ऑब्जेक्टिव-सी अमूर्त के प्रदर्शन को सीमित करता है जहां इस तरह के अनुकूलन संभव हैं।
स्मृति प्रबंधन
ऑब्जेक्टिव-सी के पहले संस्करण कचरा संग्रह (कंप्यूटर विज्ञान) का समर्थन नहीं करते थे। उस समय यह निर्णय कुछ बहस का विषय था, और कई लोगों ने पूरे सिस्टम को अनुपयोगी बनाने के लिए लॉन्ग डेड टाइम (जब स्मॉलटाक ने संग्रह का प्रदर्शन किया) माना। कुछ तीसरे पक्ष के कार्यान्वयन ने इस सुविधा को जोड़ा है (सबसे विशेष रूप से Boehm कचरा संग्राहक का उपयोग करके GNUstep), और एप्पल ने इसे Mac OS X v10.5 के रूप में प्रयुक्त किया है।[54] हालाँकि, मैक ओएस और iOS के अधिक हाल के संस्करणों में, कचरा संग्रह को 2011 में प्रारंभ की गई स्वचालित संदर्भ गणना (ARC) के पक्ष में बहिष्कृत कर दिया गया है।
एआरसी के साथ, कंपाइलर आवेषण स्टेटिक प्रोग्राम विश्लेषण के आधार पर स्वचालित रूप से ऑब्जेक्टिव-सी कोड में कॉल को बनाए रखता है और जारी करता है। स्वचालन प्रोग्रामर को स्मृति प्रबंधन कोड में लिखने से राहत देता है। एआरसी ऑब्जेक्टिव-सी भाषा में कमजोर संदर्भ भी जोड़ता है।[55]
===ऑब्जेक्टिव-सी और सी++=== के बीच दार्शनिक अंतर
सी ++ और ऑब्जेक्टिव-सी का डिज़ाइन और कार्यान्वयन सी को विस्तारित करने के लिए मौलिक रूप से अलग-अलग दृष्टिकोणों का प्रतिनिधित्व करता है।
सी की प्रक्रियात्मक प्रोग्रामिंग की शैली के अतिरिक्त, सी ++ सीधे वस्तु-उन्मुख प्रोग्रामिंग, सामान्य प्रोग्रामिंग और मेटाप्रोग्रामिंग के कुछ रूपों का समर्थन करता है। सी++ भी सी++ मानक पुस्तकालय के साथ आता है जिसमें अनुक्रम कंटेनर (सी++) सम्मिलित है। इसी तरह, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, डायनामिक टाइपिंग और प्रतिबिंब (कंप्यूटर विज्ञान) में ऑब्जेक्टिव-सी जोड़ता है। इसका उपयोग OpenStep जैसी लाइब्रेरी जैसे कि OPENSTEP, Cocoa (API), या GNUstep के साथ किया जाता है, जो C++ के मानक लाइब्रेरी के समान कार्यक्षमता प्रदान करता है।
एक उल्लेखनीय अंतर यह है कि ऑब्जेक्टिव-सी रिफ्लेक्शन (कंप्यूटर साइंस) सुविधाओं के लिए रनटाइम सपोर्ट प्रदान करता है, जबकि सी ++ सी में केवल थोड़ी मात्रा में रनटाइम सपोर्ट जोड़ता है। ऑब्जेक्टिव-सी में, किसी ऑब्जेक्ट को अपने स्वयं के गुणों के बारे में पूछा जा सकता है, जैसे, यह एक निश्चित संदेश का जवाब देगा। सी ++ में, बाहरी पुस्तकालयों के उपयोग के बिना यह संभव नहीं है।
प्रतिबिंब का उपयोग एक भाषा की गतिशील (रन-टाइम) सुविधाओं और स्थिर (संकलन-समय) सुविधाओं के बीच व्यापक अंतर का भाग है। चुकी ऑब्जेक्टिव-सी और सी ++ प्रत्येक दोनों सुविधाओं के मिश्रण को नियोजित करते हैं, ऑब्जेक्टिव-सी निश्चित रूप से रन-टाइम निर्णयों के लिए तैयार है जबकि सी ++ संकलन-समय के निर्णयों के लिए तैयार है। डायनेमिक और स्टैटिक प्रोग्रामिंग के बीच तनाव में प्रोग्रामिंग में कई क्लासिक ट्रेड-ऑफ सम्मिलित हैं: डायनेमिक फीचर्स में लचीलापन आता है, स्टैटिक फीचर्स में गति और टाइप चेकिंग सम्मिलित होती है।
रनटाइम बहुरूपता का उपयोग करके दोनों भाषाओं में सामान्य प्रोग्रामिंग और मेटाप्रोग्रामिंग को प्रयुक्त किया जा सकता है। सी ++ में यह आभासी कार्यों और रनटाइम प्रकार की पहचान का रूप लेता है, जबकि ऑब्जेक्टिव-सी गतिशील टाइपिंग और प्रतिबिंब प्रदान करता है। उद्देश्य-सी और सी ++ दोनों संकलन-समय बहुरूपता (सामान्य कार्यों) का समर्थन करते हैं, उद्देश्य-सी केवल 2015 में इस सुविधा को जोड़ रहा है।
यह भी देखें
- सी (प्रोग्रामिंग भाषा)
- सी ++
- प्रोग्रामिंग भाषाओं की तुलना
- IBM सिस्टम ऑब्जेक्ट मॉडल# संकलित क्लास लाइब्रेरी के लिए समर्थन की तुलना|COM, GObject, SOM, Windows रनटाइम, XPCOM के साथ तुलना
- स्विफ्ट (प्रोग्रामिंग भाषा)
- एक्सकोड
- WinObjC (उर्फ: आईओएस के लिए विंडोज ब्रिज)
संदर्भ
- ↑ "Runtime Versions and Platforms". Developer.apple.com. Archived from the original on July 20, 2016. Retrieved December 24, 2017.
- ↑ 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.0 3.1 "App Frameworks". Apple. June 2014. Archived from the original on February 16, 2019. Retrieved February 13, 2019.
- ↑ 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.
- ↑ Garling, Caleb. "iPhone Coding Language Now World's Third Most Popular". Wired. Archived from the original on September 9, 2013. Retrieved May 20, 2013.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ "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.
- ↑ "GNUstep: Introduction". GNUstep developers/GNU Project. Archived from the original on August 6, 2012. Retrieved July 29, 2012.
- ↑ "Kresten Krab Thorup | LinkedIn". www.linkedin.com. Archived from the original on July 15, 2014. Retrieved June 23, 2016.
- ↑ "Write Objective-C Code". apple.com. April 23, 2013. Archived from the original on December 24, 2013. Retrieved December 22, 2013.
- ↑ "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
- ↑ "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
- ↑ 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.
- ↑ "Tags for Objective-C Headers". Archived from the original on April 1, 2017. Retrieved February 11, 2018.
Objective-C is a superset of C
- ↑ "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
- ↑ 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.
- ↑ Apple, Inc. (October 19, 2009). "Avoiding Messaging Errors". The Objective-C Programming Language. Archived from the original on September 8, 2010.
- ↑ "objc_msgSend - Objective-C Runtime". Apple Developer Documentation. Retrieved 10 February 2020.
- ↑ "Messaging with the GNU Objective-C runtime". Using the GNU Compiler Collection (GCC). Retrieved 10 February 2020.
- ↑ "Category". Apple Developer (Cocoa Core Competencies).
- ↑ 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
- ↑ "Objective-C Runtime Programming Guide". Apple Inc. Archived from the original on April 4, 2014. Retrieved October 21, 2013.
- ↑ "ACM SIGGRAPH 1983 Issue 8 - Smalltalk". Archived from the original on 15 April 2009. Retrieved 7 October 2008.
- ↑ "Extension Methods (C# Programming Guide)". Microsoft. October 2010. Archived from the original on July 11, 2011. Retrieved July 10, 2011.
- ↑ "Using C++ With Objective-C". Mac OS X Reference Library. Archived from the original on September 5, 2010. Retrieved February 10, 2010.
- ↑ "Clang Language Extensions — Clang 3.5 documentation". Clang.llvm.org. Archived from the original on February 24, 2014. Retrieved April 16, 2014.
- ↑ "Objective-C 2.0: more clues". Lists.apple.com. August 10, 2006. Archived from the original on June 18, 2009. Retrieved May 30, 2010.
- ↑ "Re: Objective-C 2.0". Lists.apple.com. Archived from the original on November 24, 2010. Retrieved May 30, 2010.
- ↑ 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.0 32.1 32.2 32.3 "ObjC2 FAQ". GNUstep. Retrieved 6 January 2020.
- ↑ "Source Browser: objc4, 756.2". Apple Open Source. Retrieved 6 January 2020.
- ↑ Garbage Collection Programming Guide: Garbage Collection API Archived June 9, 2012, at the Wayback Machine (Apple developer website - search for "__strong")
- ↑ "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.
- ↑ "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.
- ↑ "Transitioning to ARC Release Notes". Apple Inc. July 17, 2012. Archived from the original on June 9, 2012. Retrieved August 26, 2012.
- ↑ 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.
- ↑ "Hamster Emporium: [objc explain]: Non-pointer isa". Sealiesoftware.com. September 24, 2013. Archived from the original on June 3, 2014. Retrieved April 27, 2014.
- ↑ Apple, Inc. (2009). "Fast Enumeration". apple.com. Archived from the original on December 17, 2009. Retrieved December 31, 2009.
- ↑ 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.
- ↑ "Blocks Programming Topics – Mac Developer Library". Apple Inc. March 8, 2011. Archived from the original on June 9, 2012. Retrieved November 28, 2012.
- ↑ 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.
- ↑ "Transitioning to ARC". Apple Inc. Archived from the original on September 7, 2011. Retrieved October 8, 2012.
- ↑ "LLVM 3.0 Release Notes". releases.llvm.org.
- ↑ "Objective-C Literals — Clang 3.5 documentation". Clang.llvm.org. Archived from the original on June 6, 2014. Retrieved April 16, 2014.
- ↑ Rhapsody Developer's Guide, AP Professional, 1997, pp. 76–84
- ↑ "Portable Object Compiler". Users.pandora.be. January 1, 1970. Archived from the original on August 2, 2008. Retrieved May 30, 2010.
- ↑ "Breadbox Computer Company LLC homepage". Archived from the original on July 27, 2011. Retrieved December 8, 2010.
- ↑ "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.
- ↑ "GNU Objective-C runtime API". Using GCC. Retrieved 6 January 2020.
- ↑ "WinObjC on GitHub". GitHub. Archived from the original on December 2, 2017. Retrieved February 13, 2018.
- ↑ "GNUStep Installer". Archived from the original on February 17, 2018. Retrieved February 14, 2018.
- ↑ 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.
- ↑ "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.
बाहरी संबंध
- Programming with उद्देश्य सी, from एप्पल (2012-12-13)
- The उद्देश्य सी Programming Language, from एप्पल (2011-10-11)
- उद्देश्य सी Runtime Programming Guide, from एप्पल (2009-10-19)
- उद्देश्य सी GNUstep Base Programming Manual
- उद्देश्य सी by Brad Cox
- उद्देश्य सी FAQ