2012-04-06 18 views
15

एनएसओब्जेक्ट प्रोटोकॉल स्टॉक प्रोटोकॉल टेम्पलेट्स के साथ आता है, लेकिन यह प्रोटोकॉल के वास्तविक कार्यान्वयन के लिए आवश्यक सभी प्रतीत नहीं होता है। इसे छोड़कर बिल्कुल कुछ भी नहीं बदलता है। तो, क्या प्रोटोकॉल के लिए यह वास्तव में आवश्यक है, या यह सिर्फ एक अनावश्यक ऐड-ऑन है?एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप प्रोटोकॉल अनुरूप होना चाहिए?

उत्तर

19

के अनुरूप है साल मैं के लिए पता नहीं है (कई की तरह मुझे) हमारे प्रोटोकॉल <NSObject> के अनुरूप नहीं बनाये। यह बढ़िया काम करता है। लेकिन यह अक्सर परेशान हो सकता है। सबसे आम परेशानी यह है कि आप respondsToSelector: का उपयोग NSObject* (किसी प्रोटोकॉल के पूरे बिंदु को हराने के बिना) कास्टिंग किए बिना नहीं कर सकते हैं। इससे ओबीजेसी 1 दिनों में कोई फर्क नहीं पड़ता क्योंकि @optional नहीं था, इसलिए हममें से कोई भी इसके बारे में चिंतित नहीं था (हमने @optional के बिना उन दिनों में प्रोटोकॉल का बहुत कुछ उपयोग नहीं किया था, वे उपयोगी नहीं थे)। फिर ओबीजेसी 2 वैकल्पिक तरीकों के अद्भुत जोड़े के साथ आया और अचानक respondsToSelector: mattered। हमारे धीमे होने में थोड़ी देर लग गई, लेकिन आखिरकार हमने यह पता लगाना शुरू कर दिया कि यदि आप अपने प्रोटोकॉल को <NSObject> के अनुरूप बनाते हैं तो जीवन बहुत आसान था। धन्य है कि इसने अब एक्सकोड में अपना रास्ता बना दिया है, जिससे सभी लोगों को अधिक सुविधाजनक तरीके से काम करना आसान हो जाता है।

लेकिन नहीं, आपको इसे करने की ज़रूरत नहीं है। इससे कई मामलों में कोई फर्क नहीं पड़ता। लेकिन ऐसा करने का कोई कारण नहीं है, इसलिए मैं इसकी अनुशंसा करता हूं।

+0

ग्रेट उत्तर ... लेकिन एनएसओब्जेक्ट प्रोटोकॉल के साथ आप जो भी परेशानी का जिक्र कर रहे हैं, वह केवल 'id obj' के साथ खेल में आएगा, क्योंकि यदि आप किसी वर्ग के साथ ऑब्जेक्ट को संदर्भित करते हैं, तो संकलक विरासत को जानेंगे ... कौन सा संभवतः NSObject के साथ शुरू होता है ... –

6

आवश्यक नहीं है। एक प्रतिनिधि केवल एक सहायक वस्तु है - केवल आवश्यकताएं हैं जो प्रतिनिधि वर्ग उस पर रखती हैं। यदि आप किसी दिए गए प्रतिनिधि के लिए आवश्यकताओं को औपचारिक बनाना चाहते हैं, तो औपचारिक प्रोटोकॉल बनाएं, यानी @protocol निर्देश का उपयोग करके प्रोटोकॉल घोषित करें। यदि NSObject प्रोटोकॉल के अनुरूप उन आवश्यकताओं में से एक है, तो आप अपने प्रोटोकॉल इसे अपनाने कर सकते हैं:

@protocol MyDelegateProtocol <NSObject> 
//... 
@end 

यही कहा, मैं एक प्रतिनिधि है कि NSObject या शायद NSProxy से प्राप्त नहीं कर रहा है बनाने के लिए किसी भी कारण नहीं दिख रहा है, और वे दोनों वर्ग पहले ही एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप हैं।

+0

प्रोटोकॉल एनएसओब्जेक्ट के अनुरूप नहीं होने पर एनएसओब्जेक्ट ब्रेक से प्राप्त एक प्रतिनिधि हो सकता है? (दूसरे शब्दों में, सामान्य कारणों में अनुरूप नहीं है प्रतिनिधि विधियों को बुलाया जाना चाहिए)? – CodaFi

+2

चूंकि एनएसओब्जेक्ट एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप है, एनएसओब्जेक्ट से व्युत्पन्न कोई भी वर्ग एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप है। तो नहीं, एनएसओब्जेक्ट से व्युत्पन्न एक प्रतिनिधि सिर्फ इसलिए नहीं तोड़ देगा क्योंकि प्रतिनिधि प्रोटोकॉल जो इसे गोद लेता है, वह एनएसओब्जेक्ट प्रोटोकॉल को स्पष्ट रूप से अपनाने वाला नहीं है। – Caleb

1

प्रत्येक ऑब्जेक्ट को NSObject उप-वर्ग नहीं करना है, इसलिए मुझे लगता है कि यदि आप इस तरह के ऑब्जेक्ट को अपने प्रोटोकॉल के अनुरूप करने की अपेक्षा कर रहे थे तो इसे एनएसओब्जेक्ट के अनुरूप नहीं होना चाहिए।

एनएसओब्जेक्ट के अनुरूप मानते हैं कि संकलक मूलभूत बातों के अनुरूप है - इसे NSObject Protocol Reference देखें। बिना कहने के मैं एनएसओब्जेक्ट के अनुरूप हूं संकलक कैसे जानता है कि मैं इनमें से किसी के अनुरूप हूं?

NSObject जबकि id रूप

typedef struct objc_object { 
    Class isa; 
} *id; 

परिभाषित किया गया है और के रूप में

@interface NSObject <NSObject> { 
    Class isa; 
} 

परिभाषित किया गया है तो id के लिए संकलक यह NSObject

1

अनुशंसा और अनिवार्य नहीं है।

एप्पल के आधिकारिक दस्तावेज ProgrammingWithObjectiveC.pdf के अनुसार

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

प्रोटोकॉल के रूप में यह ऊपर परिभाषित है NSObject प्रोटोकॉल अनुरूप बिना एक प्रोटोकॉल है। NSObject वर्ग को गोद ले;

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

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