एनएसओब्जेक्ट प्रोटोकॉल स्टॉक प्रोटोकॉल टेम्पलेट्स के साथ आता है, लेकिन यह प्रोटोकॉल के वास्तविक कार्यान्वयन के लिए आवश्यक सभी प्रतीत नहीं होता है। इसे छोड़कर बिल्कुल कुछ भी नहीं बदलता है। तो, क्या प्रोटोकॉल के लिए यह वास्तव में आवश्यक है, या यह सिर्फ एक अनावश्यक ऐड-ऑन है?एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप प्रोटोकॉल अनुरूप होना चाहिए?
उत्तर
के अनुरूप है साल मैं के लिए पता नहीं है (कई की तरह मुझे) हमारे प्रोटोकॉल <NSObject>
के अनुरूप नहीं बनाये। यह बढ़िया काम करता है। लेकिन यह अक्सर परेशान हो सकता है। सबसे आम परेशानी यह है कि आप respondsToSelector:
का उपयोग NSObject*
(किसी प्रोटोकॉल के पूरे बिंदु को हराने के बिना) कास्टिंग किए बिना नहीं कर सकते हैं। इससे ओबीजेसी 1 दिनों में कोई फर्क नहीं पड़ता क्योंकि @optional
नहीं था, इसलिए हममें से कोई भी इसके बारे में चिंतित नहीं था (हमने @optional
के बिना उन दिनों में प्रोटोकॉल का बहुत कुछ उपयोग नहीं किया था, वे उपयोगी नहीं थे)। फिर ओबीजेसी 2 वैकल्पिक तरीकों के अद्भुत जोड़े के साथ आया और अचानक respondsToSelector:
mattered। हमारे धीमे होने में थोड़ी देर लग गई, लेकिन आखिरकार हमने यह पता लगाना शुरू कर दिया कि यदि आप अपने प्रोटोकॉल को <NSObject>
के अनुरूप बनाते हैं तो जीवन बहुत आसान था। धन्य है कि इसने अब एक्सकोड में अपना रास्ता बना दिया है, जिससे सभी लोगों को अधिक सुविधाजनक तरीके से काम करना आसान हो जाता है।
लेकिन नहीं, आपको इसे करने की ज़रूरत नहीं है। इससे कई मामलों में कोई फर्क नहीं पड़ता। लेकिन ऐसा करने का कोई कारण नहीं है, इसलिए मैं इसकी अनुशंसा करता हूं।
आवश्यक नहीं है। एक प्रतिनिधि केवल एक सहायक वस्तु है - केवल आवश्यकताएं हैं जो प्रतिनिधि वर्ग उस पर रखती हैं। यदि आप किसी दिए गए प्रतिनिधि के लिए आवश्यकताओं को औपचारिक बनाना चाहते हैं, तो औपचारिक प्रोटोकॉल बनाएं, यानी @protocol
निर्देश का उपयोग करके प्रोटोकॉल घोषित करें। यदि NSObject प्रोटोकॉल के अनुरूप उन आवश्यकताओं में से एक है, तो आप अपने प्रोटोकॉल इसे अपनाने कर सकते हैं:
@protocol MyDelegateProtocol <NSObject>
//...
@end
यही कहा, मैं एक प्रतिनिधि है कि NSObject या शायद NSProxy से प्राप्त नहीं कर रहा है बनाने के लिए किसी भी कारण नहीं दिख रहा है, और वे दोनों वर्ग पहले ही एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप हैं।
प्रोटोकॉल एनएसओब्जेक्ट के अनुरूप नहीं होने पर एनएसओब्जेक्ट ब्रेक से प्राप्त एक प्रतिनिधि हो सकता है? (दूसरे शब्दों में, सामान्य कारणों में अनुरूप नहीं है प्रतिनिधि विधियों को बुलाया जाना चाहिए)? – CodaFi
चूंकि एनएसओब्जेक्ट एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप है, एनएसओब्जेक्ट से व्युत्पन्न कोई भी वर्ग एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप है। तो नहीं, एनएसओब्जेक्ट से व्युत्पन्न एक प्रतिनिधि सिर्फ इसलिए नहीं तोड़ देगा क्योंकि प्रतिनिधि प्रोटोकॉल जो इसे गोद लेता है, वह एनएसओब्जेक्ट प्रोटोकॉल को स्पष्ट रूप से अपनाने वाला नहीं है। – Caleb
प्रत्येक ऑब्जेक्ट को NSObject
उप-वर्ग नहीं करना है, इसलिए मुझे लगता है कि यदि आप इस तरह के ऑब्जेक्ट को अपने प्रोटोकॉल के अनुरूप करने की अपेक्षा कर रहे थे तो इसे एनएसओब्जेक्ट के अनुरूप नहीं होना चाहिए।
एनएसओब्जेक्ट के अनुरूप मानते हैं कि संकलक मूलभूत बातों के अनुरूप है - इसे NSObject Protocol Reference देखें। बिना कहने के मैं एनएसओब्जेक्ट के अनुरूप हूं संकलक कैसे जानता है कि मैं इनमें से किसी के अनुरूप हूं?
NSObject
जबकि id
रूप
typedef struct objc_object {
Class isa;
} *id;
परिभाषित किया गया है और के रूप में
@interface NSObject <NSObject> {
Class isa;
}
परिभाषित किया गया है तो id
के लिए संकलक यह NSObject
अनुशंसा और अनिवार्य नहीं है।
एप्पल के आधिकारिक दस्तावेज ProgrammingWithObjectiveC.pdf के अनुसार
आप के रूप में यह ऊपर परिभाषित है एक आईडी प्रोटोकॉल के अनुरूप पर
respondsToSelector:
विधि कॉल करने का प्रयास करते हैं, तो आप एक संकलक त्रुटि मिलेगी कि इसके लिए कोई ज्ञात उदाहरण विधि नहीं है।एक बार जब आप प्रोटोकॉल वाले आईडी को अर्हता प्राप्त कर लेते हैं, तो ऑलस्टैटिक टाइप-चेकिंग वापस आती है; त्रुटि प्राप्त होगी यदि आप किसी भी विधि को कॉल करने का प्रयास करते हैं जिसे निर्दिष्ट प्रोटोकॉल में परिभाषित नहीं किया गया है। कंपाइलर त्रुटि से बचने का एक तरीका है NSObject प्रोटोकॉल को अपनाने के लिए कस्टम प्रोटोकॉल सेट करना।
प्रोटोकॉल के रूप में यह ऊपर परिभाषित है NSObject
प्रोटोकॉल अनुरूप बिना एक प्रोटोकॉल है। NSObject वर्ग को गोद ले;
उदाहरण के लिए, यह NSObject प्रोटोकॉल (NSObject व्यवहार के कुछ से एक अलग प्रोटोकॉल में अपने वर्ग इंटरफ़ेस विभाजित है करने के लिए अनुरूप अपने प्रोटोकॉल को परिभाषित करने के एक अच्छी आदत है एनएसओब्जेक्ट प्रोटोकॉल)।
- 1. प्रोटोकॉल के अनुरूप गुणों को ओवरराइड करना
- 2. क्या ओबीजेसी कक्षा वस्तु प्रोटोकॉल के अनुरूप हो सकती है?
- 3. पीएचपी 5.3: "की ... घोषणा के अनुरूप होना चाहिए कि ..." त्रुटि
- 4. वर्ग बनाना मौजूदा विधियों के लिए श्रेणी के साथ प्रोटोकॉल के अनुरूप है
- 5. अनुरूप MPI_Bcast
- 6. document.readyState अनुरूप
- 7. TagBuilder.MergeAttributes अपेक्षा के अनुरूप
- 8. मैं XCode 4 में कुछ प्रोटोकॉल के अनुरूप सभी वर्गों की सूची कैसे प्राप्त करूं?
- 9. स्टेटलेस प्रोटोकॉल और स्टेटफुल प्रोटोकॉल
- 10. उद्देश्य-सी रनटाइम: यह जांचने का सबसे अच्छा तरीका है कि वर्ग प्रोटोकॉल के अनुरूप है या नहीं?
- 11. सी ++ एसटीएल-अनुरूप ऑलोकेटर्स
- 12. एक पॉज़िक्स-अनुरूप कर्नेल
- 13. सिस्टम.नानोटाइम() धागे के अनुरूप है?
- 14. प्रोटोकॉल
- 15. प्रोटोकॉल बफर
- 16. एक अच्छा ऑब्जेक्ट-ओरिएंटेड अनुरूप
- 17. प्रोटोकॉल बफर के विकल्प
- 18. एनएसओब्जेक्ट-अनुरूप वर्गों में स्वयं की विधि का उद्देश्य क्या है?
- 19. प्रदर्शन: तालिका और पाठ के अनुरूप सही
- 20. स्कैला जेनरिक: इंटरेबल के अनुरूप नहीं है?
- 21. अनुरूप तालिका के बिना कस्टम एसक्यूएल क्वेरी
- 22. LinearLayout तालिका के अंदर अनुरूप LibGDX
- 23. वेलिजन बनाम HTML में पाठ के अनुरूप
- 24. सामान्य प्रयोजन बाइनरी प्रोटोकॉल
- 25. फ़ाइल प्रोटोकॉल
- 26. प्रोटोकॉल बफर
- 27. गलत प्रोटोकॉल
- 28. UIActivityItemSource प्रोटोकॉल
- 29. प्रोटोकॉल श्रेणी
- 30. ब्लूटूथ प्रोटोकॉल?
ग्रेट उत्तर ... लेकिन एनएसओब्जेक्ट प्रोटोकॉल के साथ आप जो भी परेशानी का जिक्र कर रहे हैं, वह केवल 'id obj' के साथ खेल में आएगा, क्योंकि यदि आप किसी वर्ग के साथ ऑब्जेक्ट को संदर्भित करते हैं, तो संकलक विरासत को जानेंगे ... कौन सा संभवतः NSObject के साथ शुरू होता है ... –