Objective-C की C # से तुलना कैसे होती है? [बन्द है]


87

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

दो भाषाओं के बीच का सिंटैक्स बहुत अलग दिखता है, संभवतः क्योंकि C-C में ऑब्जेक्टिव-सी की उत्पत्ति है और जावा / सी ++ में इसकी उत्पत्ति है। लेकिन अलग-अलग वाक्यविन्यास सीखे जा सकते हैं ताकि ठीक हो।

मेरी मुख्य चिंता भाषा के साथ काम करना है और अगर यह अच्छी तरह से संरचित, पठनीय और सुरुचिपूर्ण कोड का उत्पादन करने में मदद करेगी। मैं वास्तव में C # में LINQ और var जैसी सुविधाओं का आनंद लेता हूं और आश्चर्य करता हूं कि क्या Objective-C में समकक्ष या बेहतर / विभिन्न विशेषताएं हैं।

ऑब्जेक्टिव-सी के साथ मैं कौन सी भाषा सुविधाएँ विकसित करने से चूकूंगा? मुझे क्या सुविधाएँ मिलेंगी?

संपादित करें: ढांचा तुलना उपयोगी और दिलचस्प है लेकिन एक भाषा तुलना यह है कि यह प्रश्न वास्तव में क्या पूछ रहा है (मूल रूप से मेरे साथ टैगिंग के लिए मेरी गलती है .net)। संभवतः कोको और .NET दोनों ही अपने आप में बहुत समृद्ध फ्रेमवर्क हैं और दोनों का उद्देश्य है, एक मैक ओएस एक्स और दूसरा विंडोज को लक्षित करना।

अब तक सुविचारित और यथोचित संतुलित दृष्टिकोण के लिए धन्यवाद!


27
Xcode परिपूर्ण नहीं है, लेकिन इसमें निश्चित रूप से बहुत सारी शक्तिशाली और उपयोगी विशेषताएं हैं। किसी चीज़ को "शुद्ध बुराई" के रूप में प्रदर्शित करना, बिना उसकी परवाह किए या तुलना के लिए कोई संदर्भ प्रदान करना FUD है जो किसी की मदद नहीं करता है। किसी भी मामले में, यह सवाल के लिए अप्रासंगिक है।
क्विन टेलर

11
Xcode 3.2 संभवतः सबसे अच्छा आईडीई है जिसका मैंने कभी उपयोग किया है, इसके सुरुचिपूर्ण ब्रेकपॉइंट हैंडलिंग, स्थिर विश्लेषण, इनलाइन त्रुटि संदेश और अन्य सुविधाओं के टन के साथ। Btw, यह "Xcode" है और "XCode" नहीं है। @ नथन, मैं वास्तव में यह नहीं देखता कि आपको "शुद्ध बुराई" कहकर एक्सकोड को बदनाम करने की आवश्यकता क्यों है - बिना किसी औचित्य के - भाषाओं के बारे में चर्चा में।
प्लेग हैमर 18

6
ऑब्जेक्टिव-सी के इस्तेमाल से आपको एक बड़ी बात यह होगी कि आपके पास कोको फ्रेमवर्क उपलब्ध होगा। इसके अलावा, C, C #, Java और C ++ सभी एक समान सिंटैक्टिक विरासत साझा करते हैं। ऑब्जेक्टिव-सी को स्मालटाक से इसका सिंटैक्स मिलता है।
आमोक

4
आप VMWare संलयन का उपयोग करके C # काम करते हैं? बस मोनो और मोनोडेवलप (जो .NET और विज़ुअल स्टूडियो का एक ओपन-सोर्स संस्करण है, जो मैक और लिनक्स पर काम करता है। मोनो का उपयोग करके आप .NET लाइब्रेरी का उपयोग करते हुए, C # का उपयोग करते हुए भी # मैक और आईफ़ोन एप्लिकेशन बना सकते हैं)। ...
रॉबिन हेगेलुंड हेन्सन

5
सी # का उपयोग करते हुए @ user668039 15 साल का अनुभव? यह 2001 में रिलीज़ हुई थी!
इयान न्यूज़न

जवाबों:


89

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

( नोट: जिस प्रकार C # को कसकर .NET से जोड़ दिया जाता है, Objective-C को कोको से कसकर जोड़ दिया जाता है। इसलिए, मेरे कुछ बिंदु ऑब्जेक्टिव-C से असंबंधित लग सकते हैं, लेकिन Coco के बिना Objective-C, .NET के बिना C # के समान है। WPF / LINQ, मोनो के तहत चल रहा है, आदि। यह सिर्फ चीजें नहीं हैं जिस तरह से आमतौर पर किया जाता है।)

मैं मतभेदों, पेशेवरों और विपक्षों को पूरी तरह से विस्तृत करने का नाटक नहीं करूंगा, लेकिन यहां कुछ ऐसे हैं जो दिमाग में आते हैं।

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

  • C के एक सख्त सुपरसेट के रूप में, Objective-C भरोसा करता है कि आप जानते हैं कि आप क्या कर रहे हैं। C # और Java जैसी भाषाओं के प्रबंधित और / या प्रकार के दृष्टिकोण के विपरीत, Objective-C आपको वह करने देता है जो आप चाहते हैं और परिणाम अनुभव करते हैं। जाहिर है कि यह कई बार खतरनाक हो सकता है, लेकिन यह तथ्य कि भाषा सक्रिय रूप से आपको ज्यादातर चीजें करने से नहीं रोकती है, काफी शक्तिशाली है। ( EDIT: मुझे स्पष्ट करना चाहिए कि C # में "असुरक्षित" विशेषताएं और कार्यक्षमता भी हैं, लेकिन वे डिफ़ॉल्ट व्यवहार प्रबंधित कोड हैं, जिन्हें आपको स्पष्ट रूप से चुनना होगा। तुलनात्मक रूप से, जावा केवल प्रकार कोड के लिए अनुमति देता है, और कभी भी कच्चे पॉइंटर्स को उजागर नहीं करता है। जिस तरह से C और अन्य करते हैं।)

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

  • कोको कई तरह से GUI ऐप बनाता है, लेकिन आपको अपने सिर को प्रतिमान के चारों ओर लपेटना होगा। MVC डिज़ाइन कोको में व्यापक है, और प्रतिनिधि, सूचना और मल्टी-थ्रेडेड GUI ऐप्स जैसे पैटर्न, उद्देश्य-सी के लिए अच्छी तरह से अनुकूल हैं।

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

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

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


7
तकनीकी रूप से, C # में सभी गैर-प्रकार-सुरक्षित बिजली विशेषताएं हैं जो ObjC करता है: कच्चे संकेत, सूचक अंकगणित, बाध्य-अनियंत्रित सरणियाँ, यूनियनें alloca। यह सिर्फ उन्हें आसानी से सुलभ नहीं बनाता है - आपको स्पष्ट रूप से चुनने की आवश्यकता है।
पावेल मिनाएव

8
मैं बस कोको का उल्लेख करता हूं क्योंकि उद्देश्य-सी में प्रोग्रामिंग की अधिकांश अपील कोको फ्रेमवर्क के कारण है। क्या C # .NET और / या WPF के बिना दिलचस्प होगा? पूछने वाले ने विशेष रूप से लिनक्यू का उल्लेख किया है, इसलिए वह स्पष्ट रूप से भाषा से परे, अनुभव के लिए देख रहा है।
क्विन टेलर

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

11
यह बाल-विभाजन नहीं है, क्विन। मैंने केवल इस बात पर ध्यान दिलाया कि भाषा की तुलना के रूप में जो शुरुआत हुई, वह इस बात की सामान्य चर्चा में बदल गई कि कोको आपके उत्तर में किसी बिंदु पर कितना अच्छा है। मैं अभी भी यह बताना चाहूंगा कि कोको पर आपके अंक की तुलना नहीं है - वे कहते हैं कि "यह एक्स अच्छी तरह से करता है" - और यह अच्छी तरह से मामला हो सकता है - लेकिन वे नहीं कहते हैं "यह एक्स को बेहतर बनाता है / सी # से भी बदतर। डब्ल्यूपीएफ ", जो कि प्रश्न के बारे में मोटे तौर पर है।
पावेल मिनेव

6
+1 उत्कृष्ट उत्तर Quinn
h4xxr

54

मैं C, C ++ और C # में 20 से अधिक वर्षों से प्रोग्रामिंग कर रहा हूं, पहली बार 1990 में शुरू हुआ था। मैंने अभी iPhone विकास और Xcode और ऑब्जेक्टिव-सी पर एक नजर डालने का फैसला किया है। ओह माय गुडनेस ... माइक्रोसॉफ्ट के बारे में सभी शिकायतें मैं वापस लेता हूं, मुझे अब महसूस होता है कि कोड कितना खराब है। सी # क्या करता है की तुलना में उद्देश्य-सी जटिल है। मुझे C # के साथ खराब कर दिया गया है और अब मैं उन सभी कड़ी मेहनत की सराहना करता हूं जो Microsoft ने लगाई हैं। बस विधि इनवेसिव-सी को विधि इनवोकस के साथ पढ़ना मुश्किल है। इसमें C # सुरुचिपूर्ण है। यह सिर्फ मेरी राय है, मुझे आशा थी कि Apple विकास भाषा Apple उत्पादों के रूप में अच्छी थी, लेकिन प्रिय मुझे, उन्हें Microsoft से बहुत कुछ सीखना है। कोई सवाल नहीं है C # .NET एप्लिकेशन मैं XCode ऑब्जेक्टिव-सी की तुलना में कई गुना तेजी से एक आवेदन प्राप्त कर सकता है। Apple को निश्चित रूप से यहाँ Microsoft की पुस्तक से एक पत्ता निकालना चाहिए और फिर हमारे पास सही वातावरण होगा। :-)


47
भले ही आप एक iPhone देव पुस्तक पर नजर गड़ाए हुए हैं, आप अभी भी एक प्लेटफॉर्म पर तेजी से एक ऐप बनाने में सक्षम हैं जिस पर आपको 20 साल का अनुभव है? अद्भुत
Kubi

25
मुझे वाज़ जैसा ही अनुभव हो रहा है। मैं भी बहुत काम माइक्रोसॉफ्ट सी # और इस तरह के दृश्य स्टूडियो के रूप में विकास उपकरण में डाल दिया गया है के लिए अधिक आभारी हूँ के बाद मैं उद्देश्य सी सीखने शुरू कर दिया है
रेने

4
यह मेरा अनुभव था और साथ ही c # की तुलना में ऑब्जेक्टिव-सी, ओवरकमप्लेक्सिटी का अध्ययन किया। @ alexy13 मूल संदेश में से c और c ++ का कौन सा भाग आपने मिस किया है? भाषाओं के एक परिवार में दशकों का अनुभव रखने से LOT को यह मूल्यांकन करने में मदद मिलती है कि एक ही परिवार से दूसरी भाषा के साथ एक ही काम करना कितना कठिन है।
एंडरसन फोर्टालेजा

5
यह शीर्ष उत्तर कैसे है? यह संक्षिप्त जवाब नहीं है, बस कुछ भाषा के बारे में स्पष्ट रूप से पक्षपाती राय है जो उन्होंने रातोंरात सीखी है। एक ऐसी भाषा जिसके बारे में वह 20 वर्षों से उपयोग कर रहे हैं ... जाहिर है कि आप नई भाषा के बारे में कुशल नहीं होंगे
Heavy_Bullets

3
"Just reading Objective-C with method invokes is difficult to read"- यहाँ सिर्फ एक बहुत ही व्यक्तिपरक तर्क है जिसका उल्लेख ओब्ज-सी के विपक्ष के रूप में किया गया है। अन्य सभी सिर्फ विवादित बयानबाजी हैं।
स्काईविंदर

46

यहां कोई तकनीकी समीक्षा नहीं है, लेकिन मुझे सिर्फ ऑब्जेक्टिव-सी बहुत कम पढ़ने योग्य लगता है। Cinder6 ने आपको जो उदाहरण दिया है, उसे देखते हुए:

सी#

List<string> strings = new List<string>();
strings.Add("xyzzy");                  // takes only strings
strings.Add(15);                       // compiler error
string x = strings[0];                 // guaranteed to be a string
strings.RemoveAt(0);                   // or non-existant (yielding an exception)

उद्देश्य सी

NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];

यह भयानक लग रहा है। मैंने इस पर 2 किताबें पढ़ने की भी कोशिश की, उन्होंने मुझे जल्दी खो दिया, और आम तौर पर मुझे प्रोग्रामिंग किताबें / भाषाएं नहीं मिलतीं।

मुझे खुशी है कि हमारे पास मैक ओएस के लिए मोनो है, क्योंकि अगर मुझे एक अच्छा विकास वातावरण देने के लिए Apple पर भरोसा करना पड़ता ...


17
तथ्य की उपेक्षा कर कि 1 लाइन के साथ समाप्त होना चाहिए [NSMutableArray array]बजाय (वह स्मृति लीक है) और 4 लाइन के साथ शुरू कर देना चाहिए NSString* xया id x(संकलन त्रुटि) ... हाँ, ऑब्जेक्टिव-सी जेनरिक (मैं ईमानदारी से उन्हें बहुत याद नहीं है), तो आप डॉन का अभाव सरणी सिंटैक्स वाली t इंडेक्स ऑब्जेक्ट और API आमतौर पर अधिक वर्बोज़ होते हैं। To-may-to, to-mah-to। यह वास्तव में नीचे आता है जिसे आप देखना पसंद करते हैं। (आप सी ++ एसटीएल में एक ही कोड लिख सकते हैं और मुझे लगता है कि यह छिपा हुआ था।) मेरे लिए, पठनीय कोड का मतलब अक्सर कोड का पाठ आपको बताता है कि यह क्या कर रहा है, और इस प्रकार उद्देश्य-सी कोड बेहतर है।
क्विन टेलर

18
मुझे वास्तव में कुछ भी वाक्यविन्यास के साथ गलत नहीं लगता है - मुख्य कारण यह कम पठनीय लगता है क्योंकि 1) यह सी पृष्ठभूमि से आने वाले सभी के लिए अपरिचित है, और 2) यह सादे सी कंस्ट्रक्शन के बीच में उपयोग किया जाता है, जहां यह पराया लगता है। दूसरी ओर, स्माल्टालिश नाम के पैरामीटर-के-पार्ट-ऑफ-मेथड-नाम वास्तव में कॉल को गेट से अधिक समझने योग्य बनाते हैं। वास्तव में, आपका C # कोड नमूना इस बात को अच्छी तरह से प्रदर्शित करता है - यह संकलन नहीं करेगा, क्योंकि List<T>.Removeएक स्ट्रिंग को तर्क के रूप में लेता है , और पहले स्ट्रिंग को हटाता है। सूचकांक द्वारा निकालने के लिए, आपको आवश्यकता है RemoveAt
पावेल मिनाएव

12
... जबकि ओब्जेक संस्करण के साथ removeObjectAtIndex:, जबकि अधिक क्रिया, यह भी क्या करता है के रूप में असंदिग्ध है।
पावेल मिनेव

6
उत्कृष्ट अंक, पावेल। इसके अलावा, के बीच विसंगति strings[0]और strings.RemoveAt(0)स्पष्टता की राह में बाधक, कम से कम मेरे लिए। (इसके अलावा, यह हमेशा मुझे परेशान करता है जब विधि का नाम बड़े अक्षर से शुरू होता है ... मुझे पता है कि यह एक मामूली कुरूपता है, लेकिन यह सिर्फ अजीब है।)
क्विन टेलर

4
मेरे मामले में, कई लोगों के लिए, "उपकरण" की पठनीयता मेरी उत्पादकता को प्रभावित करती है। हालाँकि, मैं कई भाषाओं के साथ सहज और उत्पादक हूं, लेकिन उद्देश्य कभी नहीं रहा। लेकिन फिर, दिन के अंत में यह व्यक्तिगत प्राथमिकता के बारे में है। 20 साल पहले के विपरीत, प्लेटफ़ॉर्म Y को लक्षित करने के लिए आपको भाषा X का उपयोग करने के लिए मजबूर नहीं किया जाता है। आप जो सबसे अच्छा सूट करते हैं, उसे आप चुनते हैं।
टिमोथी

17

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

उद्देश्य-सी और कोकोआ विस्तार द्वारा प्रवर्तन पर निर्भरता पर निर्भर करता है; नियमों का एक बहुत छोटा सेट को जानें और उसका पालन करें और बदले में गतिशील रन-टाइम द्वारा आपको मुफ्त में बहुत कुछ मिलता है।

100% सही नियम नहीं, बल्कि हर रोज़ के लिए पर्याप्त है:

  • हर कॉल को वर्तमान स्कोप के अंत में allocमेल खाना चाहिए release
  • यदि आपकी विधि के लिए रिटर्न वैल्यू allocतब तक प्राप्त कर ली गई है, तो उसे return [value autorelease];ए से मैच होने के बजाय वापस कर देना चाहिए release
  • गुणों का उपयोग करें, और कोई नियम तीन नहीं है।

लंबी व्याख्या इस प्रकार है।

स्मृति प्रबंधन स्वामित्व पर आधारित है; केवल एक वस्तु उदाहरण के मालिक कभी वस्तु जारी करना चाहिए, हर कोई किसी और हमेशा कुछ भी नहीं करना चाहिए। इसका मतलब यह है कि 95% सभी कोड में आप ऑब्जेक्टिव-सी का इलाज करते हैं जैसे कि यह कचरा एकत्र किया गया हो।

तो अन्य 5% के बारे में क्या? आपके पास देखने के लिए तीन विधियाँ हैं, इन विधियों से प्राप्त किसी भी वस्तु का उदाहरण वर्तमान विधि क्षेत्र के स्वामित्व में है :

  • alloc
  • नए शब्द से शुरू होने वाली कोई भी विधि , जैसे कि newया newService
  • किसी भी तरीके की शब्द प्रति, जैसे कि copyऔर mutableCopy

इस विधि के तीन संभावित विकल्प हैं जैसे कि इसके बाहर निकलने से पहले इसके स्वामित्व वाली वस्तु के साथ क्या करना है:

  • releaseअगर जरूरत नहीं है तो इसका इस्तेमाल करके इसे रिलीज करें ।
  • किसी क्षेत्र (उदाहरण चर) , या बस इसे असाइन करके एक वैश्विक चर का स्वामित्व दें ।
  • स्वामित्व को त्यागें, लेकिन उदाहरण के लिए कॉल करने से पहले किसी और को स्वामित्व लेने का मौका दें autorelease

तो आपको सक्रिय रूप से कॉल करके स्वामित्व कब लेना चाहिए retain? दो मामले:

  • अपने इनिशियलाइज़र में फ़ील्ड असाइन करते समय।
  • जब मैन्युअल रूप से सेटर विधि को लागू करना।

2
+1 उत्कृष्ट सारांश। जब मैंने सी साल पहले सीखा था, तो बहुत समान लगता है।
एलेक्स एंगस

4
बस स्पष्ट करने के लिए, कचरा-संग्रह मैक पर ऑब्जेक्टिव-सी के लिए पूरी तरह से समर्थित है, और किसी को भी मैनुअल मेमोरी प्रबंधन करने की आवश्यकता नहीं है। मैनुअल मेमोरी प्रबंधन केवल iOS में आवश्यक है।
प्लेग हैमर

3
फिर भी, स्मृति प्रबंधन की मूल बातें सीखना अच्छा है, यदि केवल आवश्यकता होने पर ही प्रदर्शन में सुधार करना है (कचरा संग्रह चलाना नहीं है)।
FeifanZ

3
iOS 5 ने ARC की शुरुआत की, मैन्युअल रूप से आवंटित ऑब्जेक्ट को जारी करने की आवश्यकता को हटाते हुए। लेकिन यह अभी भी C # जितना आसान नहीं है। आपको यह ध्यान रखना होगा कि ऑब्जेक्टिव-सी की उम्र 20 साल से अधिक है, और इसने उन दिनों में भाषाओं की कुछ आवश्यकताओं को वापस रखा है: यह जानना है कि कब मेमोरी आवंटित करनी है और कब खाली करनी है। C # ने आपके लिए यह सब हटा दिया है। यह कहते हुए कि, कोको के पास बहुत सारे एपीआई हैं जो अभी तक विंडोज फोन में उपलब्ध नहीं हैं। इशारों जैसे कि यूआई इवेंट्स आदि के दौरान बहुत अधिक नियंत्रण ...
jyavenard

10

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

लेकिन चूंकि बहुत से कोड C, C ++, Java, जावास्क्रिप्ट, पास्कल और अन्य भाषाओं में लिखे गए हैं, आप देखेंगे कि ObjectiveC उन सभी से अलग है, लेकिन अच्छे तरीके से नहीं। क्या उनके पास इसका कोई कारण था? आइए देखें अन्य लोकप्रिय भाषाएँ:

C ++ ने C में बहुत अधिक अतिरिक्त जोड़े, लेकिन इसने मूल सिंटैक्स को केवल आवश्यकतानुसार बदल दिया।

C # ने C ++ की तुलना में बहुत अधिक एक्सट्रैस जोड़े लेकिन यह केवल उन चीजों को बदल दिया जो C ++ में बदसूरत थे (जैसे इंटरफ़ेस से "::" को निकालना)।

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

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

Visual Basic, ObjectiveC की तरह ही पैरामीटर को क्रम से बाहर कर सकता है। आप मापदंडों को नाम दे सकते हैं, लेकिन आप उन्हें नियमित रूप से भी पारित कर सकते हैं। जो भी आप उपयोग करते हैं, वह सामान्य अल्पविराम-सीमांकित तरीका है जिसे हर कोई समझता है। केवल प्रोग्रामिंग भाषाओं में ही नहीं, बल्कि पुस्तकों, समाचार पत्रों और सामान्य रूप से लिखित भाषा में कोमा सामान्य परिसीमन है।

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

पायथन में एक अलग वाक्यविन्यास है, जो पास्कल की तुलना में (मनुष्यों के लिए) पढ़ना आसान है। इसलिए जब उन्होंने इसे बदल दिया, तो इसे अलग बना दिया, कम से कम उन्होंने इसे हमारे प्रोग्रामर के लिए बेहतर बना दिया।

और फिर हमारे पास ObjectiveC है। C में कुछ सुधार जोड़ रहे हैं, लेकिन अपने स्वयं के इंटरफ़ेस सिंटैक्स, विधि कॉलिंग, पैरामीटर पासिंग और क्या नहीं का आविष्कार कर रहे हैं। मुझे आश्चर्य है कि उन्होंने + और - को स्वैप क्यों नहीं किया ताकि प्लस दो संख्याओं को घटाए। यह और भी अच्छा होता।

स्टीव जॉब्स ने ऑब्जेक्टिव का समर्थन करते हुए अपना जलवा बिखेरा। बेशक वह C # का समर्थन नहीं कर सकता है, जो बेहतर है, लेकिन अपने सबसे खराब प्रतियोगी के अंतर्गत आता है। इसलिए यह एक राजनीतिक निर्णय है, व्यावहारिक नहीं। तकनीक हमेशा पीड़ित होती है जब राजनीतिक कारणों से तकनीकी निर्णय किए जाते हैं। उसे कंपनी का नेतृत्व करना चाहिए, जो वह अच्छा करता है, और वास्तविक मामलों के लिए प्रोग्रामिंग मामलों को छोड़ देता है।

मुझे यकीन है कि iPhone के लिए और भी अधिक ऐप होंगे अगर उसने iOS और लेखन पुस्तकालयों को ObjectiveC के अलावा किसी अन्य भाषा में लिखने का फैसला किया। डाई-हार्ड प्रशंसकों, वर्जिन प्रोग्रामर और स्टीव जॉब्स को छोड़कर सभी के लिए, ObjectiveC हास्यास्पद, बदसूरत और प्रतिकारक दिखता है।


3
पिछले 2 पैराग्राफ में यह सब
जकोज

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

मैंने एक (कुंवारी) प्रोग्रामर के रूप में अपनी मुट्ठी की नौकरी में प्रवेश किया, जो उद्देश्य-सी में आईओएस-ऐप उपयोगकर्ता इंटरफेस को लागू करता है। अब मैं (3 साल के बाद) उस अकेले 'द्वीप' से बाहर निकलना चाहता हूं और कुछ और प्लेटफॉर्म-स्वतंत्र और इसलिए बहुत ही महत्वपूर्ण है। यह भी जानने के लिए कि क्या अन्य रूपरेखाओं को भी इतनी जल्दी अपडेट किया जाता है - और छोटी गाड़ी। अरे! नयी विशेषता! - क्रैश ... होप (जर्मन) जॉब सेंटर मेरे लिए जावा और / या C ++ / C # में ट्यूटोरियल पर कुछ पैसे खर्च करता है क्योंकि मैं अब Apple sh * t के लिए विकसित नहीं होना चाहता।
वार्षिकी

5

एक चीज जो मुझे ऑब्जेक्टिव-सी के बारे में पसंद है, वह यह है कि ऑब्जेक्ट सिस्टम संदेशों पर आधारित है, यह आपको वास्तव में अच्छी चीजें करने देता है जो आप C # में नहीं कर सकते (कम से कम तब तक नहीं जब तक वे डायनामिक कीवर्ड का समर्थन नहीं करते!)।

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

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


2
dynamicआपको केवल आधा मिलेगा - एक सच्ची गतिशील वस्तु को लागू करना, यहां तक ​​कि संदेश प्रतिनिधिमंडल जैसी तुच्छ चीजों के साथ, सी # 4.0 में भी थकाऊ है। दूसरी ओर, एक ला ObjC पास करने वाले लचीले सच्चे गतिशील संदेश की कीमत खोई हुई सुरक्षा है।
पावेल मिनेव

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

3
विंडोज फॉर्म डिजाइनर इतना शानदार नहीं है, लेकिन अगर आप WPF (.NET 3.0 के रूप में) का उपयोग करने में सक्षम हैं, तो एक्सप्रेशन ब्लेंड को हरा पाना मुश्किल है ...
Nate

आप इसे System.ReflectionC # 3.0 में एक्सटेंशन के साथ संयुक्त रूप से कर सकते हैं, आप अपने द्वारा ढूंढी गई किसी भी विधि को कॉल कर सकते हैं, लेकिन यह सही संदेश नहीं है, यह obj.PassMessage("function_name", params object[] args);भाषा में एकीकृत बेहतर संदेश पास करने के लिए लगेगा, सामान्य ऑब्जेक्ट पर कॉल करने योग्य अनुपलब्ध विधि जरूरत है।
बजे फिलिप कुनक

4

एक प्रोग्रामर के रूप में सिर्फ iPhone के लिए ऑब्जेक्टिव-सी के साथ शुरुआत करना, C # 4.0 से आना, मुझे लैम्ब्डा एक्सप्रेशन याद आ रहे हैं, और विशेष रूप से, लिनक-टू-एक्सएमएल। लैम्ब्डा के भाव C # -स्पेशल हैं, जबकि Linq-to-XML वास्तव में .NET बनाम कोको कंट्रास्ट से अधिक है। एक नमूना एप्लिकेशन में मैं लिख रहा था, मेरे पास एक स्ट्रिंग में कुछ एक्सएमएल था। मैं वस्तुओं के संग्रह में उस XML के तत्वों को पार्स करना चाहता था।

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

इसके विपरीत, यहाँ C # में कोड है:

using System.Linq.Xml;
XDocument doc = XDocument.Load(xmlString);
IEnumerable<MyCustomObject> objects = doc.Descendants().Select(
         d => new MyCustomObject{ Name = d.Value});

और यह बात है, आपको XML से खींची गई कस्टम ऑब्जेक्ट्स का एक संग्रह मिला है। यदि आप उन तत्वों को मान से फ़िल्टर करना चाहते हैं, या केवल उन लोगों के लिए जो एक विशिष्ट विशेषता रखते हैं, या यदि आप पहले 5 चाहते थे, या पहले 1 को छोड़ दें और अगले 3 को प्राप्त करें, या बस पता करें कि क्या कोई तत्व वापस आ गए थे ... BAM, कोड की एक ही पंक्ति में सब ठीक है।

कई ओपन-सोर्स क्लासेस हैं जो इस प्रोसेसिंग को ऑब्जेक्टिव-सी में बहुत आसान बनाते हैं, जिससे भारी लिफ्टिंग होती है। यह सिर्फ इस में निर्मित नहीं है।

* नोट: मैं वास्तव में ऊपर दिए गए कोड को संकलित नहीं करता था, यह सिर्फ C # के लिए आवश्यक क्रियात्मकता के सापेक्ष अभाव को स्पष्ट करने के लिए एक उदाहरण के रूप में है।


महत्वपूर्ण नहीं है, हालांकि, इस तुलना में सी # की ओर से "क्रिया की कमी" इतनी अधिक नहीं है, केवल यह है कि शब्दशः .net फ्रेमवर्क वर्गों में निहित है जिसका उपयोग आप अपने XML को पार्स करने के लिए कर रहे हैं। यदि आप उन के भीतर कोड की जांच करते हैं, तो आपको एक अच्छा सौदा अधिक सी # कोड, संभवतः और भी अधिक वर्बोज़ मिलने की संभावना है।
XIVSolutions

3

संभवतः सबसे महत्वपूर्ण अंतर मेमोरी प्रबंधन है। C # के साथ आपको कचरा संग्रह मिलता है, इसके आधार पर यह CLR आधारित भाषा है। ऑब्जेक्टिव-सी के साथ आपको खुद मेमोरी को मैनेज करना होगा।

यदि आप एक C # बैकग्राउंड (या उस मामले के लिए कोई भी आधुनिक भाषा) से आ रहे हैं, तो स्वचालित मेमोरी प्रबंधन के बिना किसी भाषा में जाना वास्तव में दर्दनाक होगा, क्योंकि आप अपनी मेमोरी (और डीबगिंग) को ठीक से प्रबंधित करने पर अपने कोडिंग का बहुत समय व्यतीत करेंगे कुंआ)।


6
ObjC में इन दिनों कचरा संग्रहण है। दूसरी ओर, C # यदि आप चाहते हैं (कच्चे संकेत के लिए धन्यवाद) आपको स्मृति का प्रबंधन करने देता है।
पावेल मिनाएव

3
मुझे ऑब्जेक्टिव-सी में (Apple के चौखटे के संदर्भ में) मैनुअल मेमोरी मैनेजमेंट का ज्यादा बोझ नहीं लगता है: C / और C ++ में "पारंपरिक" मेमोरी मैनेजमेंट की तुलना में रिटेन / रिलीज / ऑटोरेलेज चक्र बहुत कम बोझिल है।
मियादी

5
यह सिर्फ सही डीएसओ नहीं है - यहां तक ​​कि iPhone जैसे गैर-कचरा-संग्रह के वातावरण पर भी, बनाए रखने / जारी करने और ऑटोरेलिज सामान को सीखने में लगभग 10 मिनट लगते हैं और फिर इसकी कोई समस्या नहीं है। मैंने बहुत सारे C # -ers पाए हैं जो मेमोरी मैनेजमेंट की चुनौतियों को बढ़ा-चढ़ाकर पेश करना पसंद करते हैं। यह लगभग ऐसा है कि उन्हें डर है कि वे obj-c को बहुत अधिक पसंद करना शुरू कर देंगे अन्यथा ...;)
h4xxr

4
मैनुअल मेमोरी प्रबंधन की मूल बातें कठिन नहीं है। लेकिन यह जटिल वास्तविक जल्दी प्राप्त कर सकता है जब आप आस-पास आवंटित वस्तुओं को पारित करना शुरू करते हैं और जटिल वस्तु रेखांकन से निपटने की आवश्यकता होती है, क्योंकि आपको नियमों का सावधानीपूर्वक पालन करने की आवश्यकता होती है जो मुक्त करने के लिए जिम्मेदार हैं और कब। संदर्भ गिनती कार्यान्वयन कुछ हद तक आसान बनाते हैं, सिवाय इसके कि आपको ऑब्जेक्ट ग्राफ में चक्रों से निपटने की आवश्यकता है ... सी # की तुलना में, यह सभी आईएमओ एक बड़ा अंतर है।
DSO

1

यहाँ दो भाषाओं की तुलना करने वाला एक बहुत अच्छा लेख है: http://www.coderetard.com/2008/03/16/c-vs-objects-c/


यह अफ़सोस की बात है कि पृष्ठ UTF-8 में होने का दावा करता है, लेकिन इसमें एपोस्ट्रोफ़ और उद्धरण चिह्नों के लिए सभी प्रकार की बदली हुई जगह है। मुझे लगता है कि उनके पाठ में "सुडौल" उद्धरणों का उपयोग किया गया है, लेकिन वे कोड को सुनिश्चित करते हैं ...
क्विन टेलर

वे अपने इंट्रो पूरे हॉग को चुराते दिखाई देते हैं, लेकिन यहां तक ​​कि स्रोत लेख में उनके कोड को भी मंगाया गया है। न तो कोई विशेष रूप से महान लेख है।
dnord 18

-2

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

जहाँ तक संरचित, पठनीय संहिता का संबंध है, वहाँ का अधिकांश भार प्रोग्रामर के पास होता है, जैसा कि किसी अन्य भाषा में होता है। हालांकि, मुझे पता है कि प्रतिमान पारित होने वाला संदेश पढ़ने योग्य कोड के लिए अच्छी तरह से उधार देता है, बशर्ते आप अपने कार्यों / विधियों को उचित रूप से नाम दें (फिर से, किसी अन्य भाषा की तरह)।

मैं पहली बार मानता हूँ कि मैं C # या .NET से बहुत परिचित नहीं हूँ। लेकिन जिन कारणों से क्विन ऊपर सूचीबद्ध किया गया है, वे कुछ कारण हैं जो मुझे ऐसा बनने की परवाह नहीं है।


-3

ओबज-सी में प्रयुक्त विधि कॉल आसानी से पढ़ने के लिए कोड बनाते हैं, मेरी राय में सी # की तुलना में बहुत अधिक सुरुचिपूर्ण है और ओज-सी ग के शीर्ष पर बनाया गया है, इसलिए सभी सी कोड को ओबज-सी में ठीक काम करना चाहिए। मेरे लिए बड़ा विक्रेता हालांकि यह है कि obj-c एक खुला मानक है जिससे आप किसी भी सिस्टम के लिए कंपाइलर पा सकते हैं।


2
ISO C # भी एक खुला मानक है। इसके अलावा, जहां तक ​​मुझे पता है, अस्तित्व में एकमात्र ओबीजीसी संकलक जीसीसी है।
पावेल मिनाएव

@ पावेल: पोर्टेबल ऑब्जेक्ट कंपाइलर ( users.telenet.be/stes/compiler.html ) और क्लैंग भी है
मियादी

1
दरअसल, जीसीसी अब केवल संकलक नहीं है - क्लैंग और एलएलवीएम, जीसीसी को बदलने और विकसित करने के लिए तैयार की गई प्रौद्योगिकियों की एक जोड़ी है और जेआईटी संकलन सहित कभी भी ऐसा नहीं कर सकते हैं। यह हिम तेंदुए में ओपनसीएल के मूल में है। वे भी अन्य भाषाओं के लिए एक्स्टेंसिबल हैं, और बाहर की जाँच के लायक हैं।
क्विन टेलर

2
मैं ईमानदारी से पोर्टेबिलिटी को ऑब्जेक्टिव-सी का समर्थक नहीं मानता। बल्कि, कार्य समान कार्य को पूरा करने के लिए तेजी से विकास और कोड की कम मात्रा के साथ ताकत अधिक हैं।
क्विन टेलर

संकलक उपलब्धता पर मेरी गलती को सुधारने के लिए धन्यवाद। वैसे, पोर्टेबिलिटी तकनीकी रूप से वैसे भी है - मैं Win32 पर MinGW / ObjC का उपयोग कर सकता हूं बस ठीक है, उदाहरण के लिए - इस अर्थ में यह उतना ही पोर्टेबल है जितना कि खुद gcc है। बेशक, पुस्तकालय वहाँ नहीं होंगे (हालांकि ... वहाँ GnuStep / Win32 है?), लेकिन यह स्थिति वास्तव में मोनो के साथ हमारे मुकाबले बहुत खराब नहीं है; तो कुल मिलाकर, मैं कहूंगा कि पोर्टेबिलिटी दोनों के लिए एक मजबूत बिंदु नहीं है।
पावेल मिनाएव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.