2009-05-22 15 views
9

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

क्यों है, तो क्या आईफोन एसडीके कभी-कभी प्रतिनिधि प्रकार घोषित करने के लिए श्रेणियों का उपयोग करता है? आम तौर पर मैं उम्मीद करता हूं कि सभी प्रतिनिधियों को आईडी <MyDelegateProtocol> टाइप किया जाए लेकिन ऐसे कई उदाहरण हैं जहां यह मामला नहीं है।

उदाहरण के लिए, NSURLConnection देखें। इसके प्रतिनिधि को "आईडी" टाइप किया गया है और 'अनुबंध' को एनएसओब्जेक्ट (NSURLConnectionDelegate) पर एक श्रेणी के रूप में घोषित किया गया है।

तो: इन मामलों में श्रेणियों का उपयोग करने के लिए प्रेरणा क्या है?

उत्तर

13

उद्देश्य-सी 2.0 ने @ ओपशनल प्रोटोकॉल निर्देश प्रस्तुत किया, जिससे आप कुछ प्रोटोकॉल विधियों को वैकल्पिक होने की घोषणा कर सकते हैं। ओब्जे-सी 2.0 से पहले, श्रेणियों का उपयोग वैकल्पिक प्रतिनिधि तरीकों (विशेष रूप से, एनएसओब्जेक्ट पर श्रेणियों को अनुमति देने के लिए किया जाता था, जिन्हें अनौपचारिक प्रोटोकॉल कहा जाता है)।

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

+0

यह मेरा अनुमान था लेकिन मुझे निश्चित रूप से पता नहीं था। धन्यवाद! –

+0

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

4

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

तो मुझे लगता है कि आप जो देखते हैं वह @optional कीवर्ड से पहले के दिनों से थोड़ा सा होल्ड-ओवर है।

संपादित करें: अनुवर्ती कि मूल प्रश्न में छपी उत्तर देने के लिए: एक अनौपचारिक प्रोटोकॉल के लिए NSObject/आईडी पर एक वर्ग का उपयोग कर के लिए प्रेरणा (आंशिक रूप से दस्तावेज़ और समूह क्या तरीकों वस्तु अपने डेटा स्रोत में कॉल कर सकते हैं करने के लिए है या प्रतिनिधि या जो भी हो), और संकलक चेतावनियों से बचने के लिए कम डिग्री के लिए कि आप उन तरीकों को बुला रहे हैं जिन्हें संकलक नहीं जानता है, कॉल को प्राप्त करने वाले ऑब्जेक्ट में मौजूद होंगे। कल्पना करें कि क्लास को कार्यान्वित करने के लिए एक ऐसा तरीका है जो इन डेटासोर्स विधियों को कॉल करता है - आप शायद यह जांचना चाहेंगे कि विधि [obj respondsToSelector: @selector (my: datasource: method :)] का उपयोग कर मौजूद है, जब भी आप मेरी कॉल करने में रुचि रखते हैं : डेटास्रोत: विधि: वस्तु obj पर विधि।

+0

समझ में आता है - धन्यवाद! –

1

यह विरासत उद्देश्य-सी 1.0 से आया है, जिसमें "वैकल्पिक प्रोटोकॉल विधि" नहीं है।