2011-07-14 12 views
10

एप्पल this to say है:NSObject पर श्रेणियाँ - रखते हुए इसे सुरक्षित

रूट कक्षा

एक श्रेणी का श्रेणियाँ किसी भी वर्ग के लिए विधियों, जड़ वर्ग सहित जोड़ सकते हैं। NSObject में जोड़े गए तरीके आपके कोड से जुड़े सभी वर्गों के लिए उपलब्ध हो जाते हैं। किसी श्रेणी के साथ रूट क्लास में विधियों को जोड़ना कभी-कभी उपयोगी हो सकता है, लेकिन यह भी काफी खतरनाक हो सकता है। यद्यपि ऐसा लगता है कि श्रेणी बनाने में संशोधन अच्छी तरह से समझते हैं और सीमित प्रभाव के कारण, विरासत उन्हें एक विस्तृत दायरा देता है। आप अपने आवेदन में अदृश्य कक्षाओं में अनपेक्षित परिवर्तन कर सकते हैं; आप जो भी कर रहे हैं उसके सभी परिणामों को आप नहीं जानते हैं। इसके अलावा, आपके आवेदन पर काम करने वाले अन्य लोग, जो आपके परिवर्तनों से अनजान हैं, वे समझ नहीं पाएंगे कि वे क्या कर रहे हैं।

मेरा प्रश्न है - यदि मैं विधि नाम चुनता हूं जो पर्याप्त अजीब हैं कि मुझे पूरा यकीन है कि कोई और उनका उपयोग नहीं करेगा (या तो ऐप्पल या मेरे प्रोजेक्ट में), क्या मुझे अभी भी परेशानी हो सकती है? क्या अभी भी अप्रत्याशित व्यवहार हो सकता है? प्रदर्शन प्रभाव?

+5

उद्देश्य-सी आपको उप-वर्ग पसंद करेगा। लेकिन, इसे सुरक्षित खेलना हारने वालों के लिए है, है ना? ;) –

उत्तर

9

यदि आप वास्तव में निश्चित हैं कि ऐप्पल उस नाम की कोई विधि कभी नहीं जोड़ता है, तो यह सुरक्षित है। यदि आप को लागू करना चाहते हैं तो निश्चित रूप से चयनकर्ता नाम उपसर्ग करें। उदाहरण के लिए, एक बिंदु पर एडियम ने -setObject:atIndex: विधि NSMutableArray (हां, मौजूदा एपीआई विधि -replaceObject:atIndex पर केवल "कॉस्मेटिक" रैपर जोड़ा। बहुत व्यर्थ) ... यह एक आंतरिक विधि के रूप में वही नाम है, और वीरी थोड़ा अलग अर्थशास्त्र। इससे दुर्घटनाएं हुईं, लेकिन केवल कुछ ओएस पर। अगर इसे -AISetObject:atIndex: जैसे कुछ नाम दिया गया था तो यह ठीक रहेगा।

श्रेणियों के लिए प्रदर्शन प्रभाव न्यूनतम हैं। मैं उस पहलू के बारे में चिंता नहीं करता।

+3

यह सिर्फ सिस्टम नहीं है। एक श्रेणी विधि में एक क्रैश रिपोर्ट '- [NSDictionary setDoubleValue: forKey:] 'एक इनपुट मैनेजर के साथ एक संघर्ष साबित हुआ जिसने एक ही नाम के साथ एक विधि लागू की लेकिन स्पष्ट रूप से किसी ऑब्जेक्ट को डबल: पैरामीटर के रूप में अपेक्षित किया। इनपुट मैनेजर का उपयोग iChat में कोड इंजेक्ट करने के लिए किया जा रहा था, लेकिन इसकी फाउंडेशन श्रेणियों समेत प्रत्येक ऐप में पूर्ण हैक को स्पष्ट रूप से लोड किया गया था। –

+0

मुझे लगता है कि AISetObject अब "कॉस्मेटिक" नहीं होता :-) –

1

यदि आपके विधि नाम कुछ भी नहीं करते हैं, और जो लोग उनका उपयोग करते हैं उन्हें पता है कि वे क्या करते हैं, तो आपको किसी भी समस्या में भाग नहीं लेना चाहिए। याद रखें, एक श्रेणी अतिरिक्त विधियों को जोड़ती है, लेकिन कक्षा में आवृत्ति चर नहीं है। एक उपclass अधिक लचीला है, और इसे एक संपूर्ण वस्तु के रूप में माना जाता है, जो सभी सुपरक्लास विधियों के साथ-साथ स्वयं का जवाब देता है। मैं कहूंगा कि उप-वर्ग बनाना जब तक कि आप ऐसा करने के लिए असुविधाजनक नहीं हो सकते हैं। सभी के बाद श्रेणियों का इस्तेमाल किया गया था। मेरे पास आमतौर पर श्रेणियों का उपयोग होता है जब मेरे पास ढांचा होता है और मुझे सार्वजनिक रूप से घोषित कक्षा में निजी तरीकों को जोड़ने की आवश्यकता होती है।

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