2012-01-06 13 views
6

मुझे पता है कि प्रोटोकॉल के लिए निर्देश @protocol है जैसे @selector, लेकिन प्रोटोकॉल के संदर्भ में "प्रकार" क्या है (उदाहरण के लिए @ सेलेक्टर के लिए एसईएल)? मैकोज़क्स स्टैक में, यह प्रोटोकॉल * है?उद्देश्य-सी में प्रोटोकॉल का संदर्भ कैसे लें?

id<TheNameOfTheProtocol> aVariableToThatProtocol; 

या यदि संदेश एक (Protocol *) वस्तु चाहता है:

[myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)]; 

उत्तर

13

आप के रूप में यह संदर्भ?

मैं सेब की आधिकारिक DOC में जाना जाता है, और एक सरल उदाहरण पाया करने के लिए एक प्रोटोकॉल में अन्य प्रोटोकॉल का संदर्भ लें:

#import "B.h" 

@protocol B; // To break the recursive cycle, you must use the @protocol directive to make a forward reference to the needed protocol instead of importing the interface file where the protocol is defined 

@protocol A 
    - foo:(id <B>)anObject; 
@end 

जहां प्रोटोकॉल बी इस तरह घोषित किया जाता है:

#import "A.h" 

@protocol B 
    - bar:(id <A>)anObject; 
@end 

ध्यान दें कि @protocol निर्देश का उपयोग इस तरीके से बस संकलक को सूचित करता है कि बी बाद में परिभाषित प्रोटोकॉल है। यह इंटरफ़ेस फ़ाइल आयात नहीं करता है जहां प्रोटोकॉल बी परिभाषित किया गया है।


और here're अधिक चीजों को आप चाहें तो के बारे में पता करने के लिए:

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

स्रोत कोड है कि यहाँ यह पीछे आने वाले कोष्ठकों का एक सेट को छोड़कर @protocol() के निर्देश -इस ही निर्देश है कि एक प्रोटोकॉल वाणी का उपयोग कर एक प्रोटोकॉल वस्तु का उल्लेख कर सकते हैं।

Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport); 

यही एक रास्ता है कि स्रोत कोड एक प्रोटोकॉल वस्तु जादू कर सकते हैं: कोष्ठकों प्रोटोकॉल नाम संलग्न है। कक्षा के नाम के विपरीत, प्रोटोकॉल नाम ऑब्जेक्ट को निर्दिष्ट नहीं करता है- @protocol() के अंदर छोड़कर।


और क्या अधिक है, भेजने एक conformsToProtocol: संदेश द्वारा एक वस्तु एक प्रोटोकॉल के अनुरूप है कि क्या जांच करने के लिए संभव है:

if (! [receiver conformsToProtocol:@protocol(MyXMLSupport)] ) { 
    // Object does not conform to MyXMLSupport protocol 
    // If you are expecting receiver to implement methods declared in the 
    // MyXMLSupport protocol, this is probably an error 
} 

conformsToProtocol: परीक्षण की तरह है प्रतिसाद देता है चयनकर्ता: एक विधि के लिए परीक्षण, सिवाय इसके कि यह जांच करता है कि प्रोटोकॉल अपनाया गया है (और संभवतः सभी विधियों को लागू करने की घोषणा) केवल एक विशेष विधि लागू की गई है या नहीं। चूंकि यह प्रोटोकॉल में सभी विधियों की जांच करता है, conformsToProtocol:प्रतिक्रियाओं से अधिक कुशल हो सकता है चयनकर्ता:

conformsToProtocol: सिवाय इसके कि यह एक प्रकार एक प्रकार वंशानुगत पदानुक्रम के आधार पर एक प्रोटोकॉल के बजाय के आधार पर परीक्षण परीक्षण,: परीक्षण isKindOfClass की तरह भी है।

+0

बस उत्सुक, किसी भी कारण है कि एक प्रोटोकॉल "प्रकार" एक "आईडी के साथ इस्तेमाल किया जाना चाहिए ? " सी # पृष्ठभूमि से आ रहा है, इंटरफ़ेस संदर्भ को विज़ुअलाइज़ करना थोड़ा आसान है क्योंकि आप इसकी घोषणा केवल कक्षा संदर्भ (यानी आईप्रोटोकॉल प्रोटोकॉल;) के समान ही करते हैं। – 5StringRyan

+0

@ 5StringRyan मुझे तर्क नहीं पता है, लेकिन 'id' प्रकार किसी भी ऑब्जेक्ट के लिए सामान्य प्रकार है, भले ही यह NSObject नहीं है। इस वाक्यविन्यास का एक फायदा यह है कि यह एकाधिक प्रोटोकॉल की अनुमति देता है। आप आईडी को पढ़ने के लिए कुछ भी कर सकते हैं <पठनीय, लिखने योग्य> 'यह व्यक्त करने के लिए कि ऑब्जेक्ट दोनों प्रोटोकॉल के अनुरूप है। या, यदि आपका प्रोटोकॉल NSObject के अनुरूप नहीं है, लेकिन आप जिस क्लास इंस्टेंस का संदर्भ देते हैं, तो आप निम्न कार्य कर सकते हैं: 'id '। –

+3

@ 5StringRyan प्रकार * नहीं * 'id' होने की आवश्यकता है। उदाहरण: 'एनएसएआरएआर * var = [एनएसएआरएआरए सरणी]; कानूनी रूप से कानूनी रूप से उपयोगी है। आप 'एनएसएआरएआरई * var = [NSArray array] भी लिख सकते हैं;' sooo ... यह निश्चित रूप से कुछ प्रकार की सुरक्षा इंजेक्ट करने का एक अच्छा तरीका है। (उदाहरण मूर्ख हैं - वे केवल वाक्यविन्यास का प्रदर्शन करते हैं) – justin

4

id <YourProtocol> delegate (जो प्रोटोकॉल संदर्भ के लिए प्रयोग किया जाता है)

2

यह ओएस एक्स पर के रूप में ही है:

Protocol * p = objc_getProtocol("UITableViewDataSource"); 

यह <objc/runtime.h> में घोषित की गई:

typedef struct objc_object Protocol; 
संबंधित मुद्दे