2011-01-31 14 views

उत्तर

77

असल में, एक उद्देश्य-सी विधि केवल एक सी फ़ंक्शन है जिसमें शुरुआत में दो तर्क हमेशा मौजूद होते हैं।

यह:

-(void)aMethod; 

वास्तव में इस के बराबर है:

void function(id self, SEL _cmd); 

ऑब्जेक्टिव-सी के मैसेजिंग ऐसी है कि यह:

[someObject aMethod]; 

वास्तव में इस के बराबर है (लगभग - - इस उत्तर के दायरे से परे एबीआई मुद्दा एक भिन्न तर्क है):

objc_msgSend(someObject, @selector(aMethod)); 

objc_msgSend(), और फिर, एक पूंछ कॉल अनुकूलन के जादू के माध्यम से (someObject पर यह देख कर) विधि का उचित कार्यान्वयन पाता विधि के कार्यान्वयन के लिए कूदता है, जो सभी इरादों और उद्देश्यों के लिए

function(someObject, @selector(aMethod)); 

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

ऐसा करने से, गधे में एक पूर्ण दर्द होगा और ऐसा करने के अविश्वसनीय रूप से शैक्षिक अनुभव से परे आपके समय के लायक नहीं होगा।


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

अपने खुद के मॉडल स्तर कोड को अपेक्षाकृत स्टैंडअलोन लिखते समय भी, आप आमतौर पर उद्देश्य-सी का उपयोग करेंगे क्योंकि यह ऑब्जेक्ट उन्मुख प्रोग्रामिंग का एक मूल किरायेदार राज्य/डेटा & कार्यक्षमता के बीच एक बहुत ही प्राकृतिक गोंद प्रदान करता है।

+0

बहुत संक्षिप्त और सहायक। मुझे याद है कि मूल सी ++ भी एक प्रीप्रोसेसर था। – AlanObject

9

ऑब्जेक्टिव-सी में, मैं एक कार्यक्रम लिख रहा हूँ, तो जब मैं एक इस की आवश्यकता होगी

+०१२३५१६४१०:

[myObject myFunction]

एसी विधि रूप है

-(return-type)function-name:argument1 {}

या एक बहु-तर्क समारोह के लिए

-(return-type)function-name:argument1 function-name:argument2 {}

मैं हमेशा ऑब्जेक्टिव-सी का उपयोग करें:

return-type function-name(argument1, argument2, etc) {}

एक ऑब्जेक्टिव-सी उदाहरण विधि रूप है Obj-C प्रोग्रामिंग में स्टाइल विधियां, भले ही आप अभी भी सी-प्रकार के फ़ंक्शंस का उपयोग कर सकें।

मैं [myObject myMethod:arg] के लिए C में बराबर हो सकता है myObject.myMethod(arg)

+6

असल में सी में कोई तरीका नहीं है, केवल फ्रीस्टैंडिंग फ़ंक्शन; आपके द्वारा लिखे गए अंतिम "समकक्ष सी" वाक्यविन्यास उदाहरण विधियों के लिए * सी ++ * वाक्यविन्यास है। –

+0

मेरे लिए, विधियों और कार्यों एक ही चीजें हैं। यानी भाषा में अंतर-परिवर्तनीय। कुछ प्रोग्रामिंग भाषाएं भेदभाव करती हैं, लेकिन बोर्ड में आपके पास कुछ लोग फ़ंक्शन का उपयोग करेंगे जहां विधि उपयुक्त है और इसके विपरीत। – aqua

+4

@aqua: AFAIK, जब आप ऑब्जेक्ट्स (http://en.wikipedia.org/wiki/Method_%28computer_programming%29) के बारे में बात कर रहे हैं, तो आप विधियों के बारे में बात करते हैं, अन्यथा आपके पास कोई फ़ंक्शन या सबराउटिन है। फिर भी, मेरा मूल बिंदु यह था कि आपके द्वारा लिखे गए अंतिम "समकक्ष सी" वाक्यविन्यास को समझ में नहीं आता है, क्योंकि सी में कोई वस्तु नहीं है ('संरचना के पास उदाहरण विधियां नहीं हैं)। इसके बजाए, उदाहरण वाक्य के लिए ** सी ++ ** में उपयोग किया गया वाक्यविन्यास है। –

2

पहले एक फ्रीस्टैंडिंग समारोह है लगता है। दूसरा उद्देश्य-सी वर्ग के लिए एक उदाहरण विधि है। तो मुझे लगता है कि यदि आप वास्तव में कक्षा लिख ​​रहे हैं तो आपको दूसरे संस्करण की आवश्यकता होगी।

+0

मुफ्त -फॉर्मिंग फ़ंक्शन * बस 'फ्री' फ़ंक्शन का उल्लेख मॉलोक/फ्री के साथ भ्रमित किया जा सकता है। – dcousens

+0

@ डैनियल वास्तव में, मैंने अपना जवाब संपादित किया। –

संबंधित मुद्दे