2009-04-09 13 views
69

में प्रोटोकॉल/प्रतिनिधियों का विस्तार कैसे करें यदि मैं AVAudioPlayer जैसी कक्षा का विस्तार करना चाहता हूं, तो AVAudioPlayerDelegate में एक और तरीका जोड़ने का सबसे अच्छा तरीका क्या है? क्या मैं इसके लिए एक श्रेणी बना सकता हूं, क्या मैं इसे विस्तारित करता हूं? यदि मैं इसे विस्तारित करता हूं तो मुझे वास्तविक प्रतिनिधि गेटटर/सेटर को ओवरराइट करना भी सुनिश्चित करना होगा? मैं प्रोटोकॉल कैसे बढ़ाऊंगा? निम्नलिखित मुझे त्रुटियोंउद्देश्य-सी



@protocol AudioTrackDelegate : AVAudioPlayerDelegate { 
    - (void)foo; 
} 
@end 

@interface AudioTrack : AVAudioPlayer { 
} 
@end 

उत्तर

125

देता है एक प्रोटोकॉल है कि एक और प्रोटोकॉल को लागू करता है बनाने के लिए वाक्य रचना इस तरह के रूप में है:

@protocol NewProtocol <OldProtocol> 
- (void)foo; 
@end 

आप एक सूचक OldProtocol आप कर सकते हैं के रूप में आपके द्वारा लिखा गया पर NewProtocol में एक विधि कॉल करना चाहते हैं या तो respondsToSelector फोन:

if ([object respondsToSelector:@selector(foo)]) 
    [(id)object foo]; 

या NSObject पर एक वर्ग के रूप में ठूंठ पद्धतियां निर्धारित:

@interface NSObject (NewProtocol) 
- (void)foo; 
@end 
@implementation NSObject (NewProtocol) 
- (void)foo 
{ 
} 
@end 
+0

यदि मैं एक प्रोटोकॉल बनाता हूं जो एक और प्रोटोकॉल लागू करता है ... क्या मुझे कुछ और करने की ज़रूरत है ताकि 'OldProtocol' विधियों को निकाल दिया जा सके ?क्योंकि मेरे लिए मुझे नया प्रोटोकॉल फायरिंग मिल रहा है लेकिन सभी मौजूदा लोग अब – dizy

+10

नहीं हैं प्रोटोकॉल में विधियां नहीं हैं, इसमें विधि परिभाषाएं हैं; यानी, यह नाम, तर्क और रिटर्न प्रकारों का वर्णन करता है जिन्हें कक्षा को प्रोटोकॉल को "अनुरूप" समझा जाना चाहिए। आपकी टिप्पणी/प्रश्न से मैं शर्त लगा रहा हूं कि आप अपने सुपर-डिलीगेट में [सुपर सेटडिलेगेट: वैल्यू] को कॉल करना भूल रहे हैं: – rpetrich

+0

इस दृष्टिकोण का उपयोग करके आप नए प्रोटोकॉल के तरीकों का खुलासा नहीं करते हैं, एक साफ तरीके से मेरे उत्तर पर एक नज़र डालें – Kappe

11

एक प्रोटोकॉल याद रखें संकलित एप्लिकेशन के लिए कोई कोड कहते हैं - यह केवल तथ्य यह है कि अपने वर्ग के तरीकों को लागू करना चाहिए प्रोटोकॉल के लिए "अनुरूप" पर विचार किया जाना लागू करता है।

@protocol plays 
    - (void) play; 
    - (NSString *) type; 
@end 

और फिर एक वर्ग है कि अनुरूप: तो आप उदाहरण के लिए एक <plays> प्रोटोकॉल बना सकते हैं <printable> या <serialized>, आदि: इस का एक अच्छा उपयोग ऑपरेटिंग के सभी एक ही तरह के साथ वर्गों के एक समूह उत्पन्न करने के लिए किया जाएगा <plays> पर play और type विधियों को लागू करना आवश्यक है। यदि ऐसा नहीं होता है, तो संकलक चेतावनी जारी करता है लेकिन कक्षा को संकलित करता है।

if ([obj conformsTo: @protocol(plays)]) { 
    [obj play]; 
} 

एक वर्ग वास्तव में अपने वर्ग के लिए गतिशील रूप से नए तरीकों को जोड़ता है: अपने कोड में आप अगर एक वस्तु निम्न कोड के साथ एक प्रोटोकॉल का पालन करती है की जाँच करें। इन विधियों को चुनिंदा समय के रूप में रनटाइम के लिए विश्व स्तर पर पहुंचा जा सकता है और @selector(foo) और [object foo:bar];

किसी श्रेणी का उद्देश्य कक्षा में विशेष नया कोड जोड़ना है, भले ही आपके पास स्रोत कोड न हो वह वर्ग वहाँ सुरक्षा की समस्याओं हो सकता है और आप शायद कक्षाओं में मेमोरी लीक, आदि

आपके मामले में बना सकते हैं एक अलग फाइल AVAudioPlayerDelegate_TrackOps.m

#import "AVAudioPlayerDelegate.h" 
@implementation AVAudioPlayerDelegate (TrackOps) 

- (NSObject *) foo { 
    // do foo stuff; 
    return bar; 
} 

@end 

NSObject के एक वर्ग के रूप में यह लाना में सभी वर्गों foo का जवाब बनाता है । Foo एक स्टैंड अकेले विधि Objc_perform_selector(@selector(foo)) भी हो सकता है।

नीचे पंक्ति: विधि कार्यान्वयन के लिए प्रोटोकॉल को लागू करने के लिए एक वर्ग, त्वरित प्रोटोकॉल जोड़ने के लिए एक वर्ग का उपयोग करें, और मौजूदा कक्षाओं (सदस्य चर या प्रमुख नई कार्यक्षमता जोड़ने जैसी चीजों) को विशेषज्ञता देने के लिए उप-वर्ग। उप-वर्ग की आवश्यकता नहीं होती है और वांछित होने पर श्रेणियों को ओवरराइड करने के लिए भी इस्तेमाल किया जा सकता है, लेकिन आम तौर पर यदि आप कक्षा में कार्यक्षमता जोड़ना चाहते हैं तो आप उप-वर्ग बनाते हैं। अधिक उदाहरणों, विचारों, इस विषय पर अन्य सामान्य जानकारी के लिए, हमेशा Apple introduction to Objective-C

+0

क्या आप प्रोटोकॉल में श्रेणी जोड़ने के तरीके के बारे में विस्तार से बता सकते हैं? मुझे लगता है कि आपने जो लिखा है उसके वाक्यविन्यास के साथ कुछ गलत है। धन्यवाद – dizy

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

  • कोई संबंधित समस्या नहीं^_^