2011-01-14 8 views
5

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

जहां तक ​​मुझे यह सही लगता है, एकमात्र कारण यह अनौपचारिक प्रोटोकॉल का उपयोग करता है (दूसरे शब्दों में, एनएसओब्जेक्ट पर श्रेणियां जो विधि कार्यान्वयन प्रदान नहीं करती हैं), एक्सकोड में स्वत: पूर्णता देने के लिए है।

एक उदाहरण है NSCibLoading.h में परिभाषित -awakeFromNib विधि, जो NSObject पर एक अनौपचारिक प्रोटोकॉल है। यदि कोई ऑब्जेक्ट उस विधि को लागू करता है तो निब लोडिंग सिस्टम रनटाइम पर जांचता है। अगर ऐसा होता है, तो यह इसे कॉल करता है।

लेकिन अब कल्पना करें कि अनौपचारिक प्रोटोकॉल नामक कोई सुविधा नहीं थी। जिस विकल्प का सटीक प्रभाव होगा, वह असली @ प्रोोटोकॉल घोषणा होगी जो एक वैकल्पिक विधि -awakeFromNib घोषित करता है। NSObject बस उस प्रोटोकॉल को अपनाने वाला होगा और संकलक खुशी से स्वत: पूर्णता प्रदान करेगा।

क्या कोई इन दोनों रणनीतियों के बीच बड़ा अंतर बता सकता है? मुझे अनौपचारिक प्रोटोकॉल का बिंदु नहीं दिख रहा है लेकिन वास्तव में ऐसा करना पसंद करेंगे।

उत्तर

7

दो भारी अंतर:

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

  2. यह NSObject अनचाहे रखता है। पुरानी शैली अनौपचारिक प्रोटोकॉल के साथ वैकल्पिक रूप से सभी विधियों के बजाय आमतौर पर उनके डिफ़ॉल्ट कार्यान्वयनNSObject में जोड़ा गया था।

अनौपचारिक प्रोटोकॉल जहां एक समस्या यह है कि अब ऑब्जेक्टिव-सी 2.0 में प्रोटोकॉल में वैकल्पिक तरीकों की शुरूआत के बाद से अस्तित्व में एक स्वच्छ समाधान।

+0

मैं देखता हूं। अनौपचारिक प्रोटोकॉल अतीत से आते हैं जहां कोई वैकल्पिक प्रोटोकॉल विधियां नहीं थीं। अब यह समझ में आता है। –

+0

मैंने अपने उत्तर को यह भी स्पष्ट रूप से बताया कि अनौपचारिक प्रोटोकॉल विरासत का एक उत्पाद है। – PeyloW

1

आदेश में एक प्रोटोकॉल का उपयोग करने के लिए, आप के लिए एक वर्ग प्रयोग की जाने वाली यह आयात करते हैं और जाने वस्तु आप में कोडिंग कर रहे हैं यह

TestViewController : UIViewController <MyAwesomeProtocol> 

के अनुरूप आदेश में करना होगा, आप की जरूरत नहीं है ऐसी चीजें करें, आप आसानी से श्रेणी आयात कर सकते हैं (जो सभी मामलों में भी आवश्यक नहीं है) और ऑब्जेक्ट का उपयोग करें (मेरे मामले में एक UIViewController) जैसा कि आप नियमित रूप से करेंगे, और एक्सकोड आपको श्रेणी विधियों के लिए स्वत: पूर्णता प्रदान करेगा।

मैं प्रोटोकॉल के तरीके को प्राथमिकता देता हूं, यह अधिक सख्त और भरोसेमंद है। श्रेणियां निर्माण के मुद्दों का कारण बनती हैं और कुछ अजीब होती हैं (ज्यादातर, सभी मामलों में नहीं) ईमानदार होने के लिए।

+0

किस तरह की इमारत के मुद्दे? –

+0

ऐसे मामले हैं जहां आप पुस्तकालयों का मिश्रण उपयोग करते हैं, या यहां तक ​​कि एक पुस्तकालय संकलित भी करते हैं, और श्रेणियां एक दीवार पर जाती हैं।इस समय मेरे पास स्पष्ट उदाहरण नहीं है, लेकिन मुझे पता है कि तीन20 ढांचे ने श्रेणियों के कारण हमारी परियोजना में इस तरह की समस्याएं पैदा की हैं। एक बड़ा प्रशंसक नहीं है। – Jake

3

बड़ा अंतर यह है कि @optional कीवर्ड केवल कुछ साल पहले पेश किया गया था। नए कोड के लिए, अनौपचारिक प्रोटोकॉल मूल रूप से अप्रचलित होते हैं। अधिकांश ढांचे गैर-नए कोड हैं।

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