एक प्रोटोकॉल याद रखें संकलित एप्लिकेशन के लिए कोई कोड कहते हैं - यह केवल तथ्य यह है कि अपने वर्ग के तरीकों को लागू करना चाहिए प्रोटोकॉल के लिए "अनुरूप" पर विचार किया जाना लागू करता है।
@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
स्रोत
2009-04-09 16:58:20
यदि मैं एक प्रोटोकॉल बनाता हूं जो एक और प्रोटोकॉल लागू करता है ... क्या मुझे कुछ और करने की ज़रूरत है ताकि 'OldProtocol' विधियों को निकाल दिया जा सके ?क्योंकि मेरे लिए मुझे नया प्रोटोकॉल फायरिंग मिल रहा है लेकिन सभी मौजूदा लोग अब – dizy
नहीं हैं प्रोटोकॉल में विधियां नहीं हैं, इसमें विधि परिभाषाएं हैं; यानी, यह नाम, तर्क और रिटर्न प्रकारों का वर्णन करता है जिन्हें कक्षा को प्रोटोकॉल को "अनुरूप" समझा जाना चाहिए। आपकी टिप्पणी/प्रश्न से मैं शर्त लगा रहा हूं कि आप अपने सुपर-डिलीगेट में [सुपर सेटडिलेगेट: वैल्यू] को कॉल करना भूल रहे हैं: – rpetrich
इस दृष्टिकोण का उपयोग करके आप नए प्रोटोकॉल के तरीकों का खुलासा नहीं करते हैं, एक साफ तरीके से मेरे उत्तर पर एक नज़र डालें – Kappe