this question के कुछ उत्तरों के आधार पर ऐसा लगता है कि + ऑलोक उद्देश्य-सी में किसी ऑब्जेक्ट के उदाहरण के लिए मेमोरी आवंटित करने के लिए कुछ पीछे के दृश्य जादू करता है। क्या कभी भी ऑलोक ओवरराइड करने की ज़रूरत है?क्या उद्देश्य-सी में + आवंटन को ओवरराइड करने के लिए कक्षा की आवश्यकता है?
उत्तर
यह काफी दुर्लभ है।
एनएसएसटींग एक वर्ग का एक उदाहरण है जो कार्यान्वयन विस्तार के रूप में + आवंटित ओवरराइड करता है। यदि आप जांचना चाहते थे, तो आपको + NSString alloc] क्लास NSPlaceholderString का कुछ रिटर्न मिलेगा। यह स्ट्रिंग class cluster के कार्यान्वयन का हिस्सा है।
आप एक अलग आवंटन एनएसजेडोन से डिफ़ॉल्ट रूप से आवंटित करने के लिए ओवरराइड भी कर सकते हैं। या, आप NSAllocateObject पर अपने इवर के बाद गतिशील मात्रा प्रदान करने के लिए extraBytes
के लिए कुछ शून्य के साथ कॉल करने जैसी चालें चला सकते हैं। उदाहरण के लिए, आप सोच सकते हैं कि NSString के निजी उपवर्ग है कि आप सामान्य रूप से अंत कुछ इस तरह दिखेगा:
@interface {
NSUInteger length;
unichar *data;
}
लेकिन यह है कि ऐसा नहीं है। यह स्मृति का एक एकल ब्लॉक है जिसमें लंबाई और वर्ण डेटा दोनों शामिल हैं। विभिन्न एनएसएसटींग उदाहरण स्मृति के विभिन्न आकार ब्लॉक हैं। यह ऐसी चीज है जिसे आप सीधे एनएसएएलओएलओटीओब्जेक्ट को कॉल करके व्यवस्थित कर सकते हैं।
लेकिन ये सभी चीजें चाल और हैक्स हैं। यदि आप + ऑलोक ओवरराइड करते हैं, तो कुछ खास चल रहा है।
+alloc
कोई जादू नहीं कर रहा है, यह केवल क्लास इंस्टेंस के आकार को प्राप्त करने और स्मृति की मात्रा आवंटित करने के लिए उद्देश्य-सी रनटाइम में एक विधि को कॉल कर रहा है। एक सच्चे सिंगलटन लिखते समय आप +alloc
को ओवरराइड करना चाहते हैं (यानी आप गारंटी देना चाहते हैं कि आपकी कक्षा का केवल एक ही उदाहरण आवंटित किया जा सकता है)। हालांकि सिंगलटन कक्षा लिखते समय इन लंबाईों पर जाना शायद ही कभी आवश्यक है, आप कर सकते हैं। सामान्य रूप से आप विकल्प प्रदान करने के लिए +alloc
ओवरराइड करेंगे (जैसे किसी भिन्न क्षेत्र में स्मृति आवंटित नहीं करना, प्राप्त वर्ग की तुलना में एक अलग वर्ग आवंटित करना - यह क्लास क्लस्टर क्या कर सकता है) व्यवहार या आप मानक काम करने के लिए +[super alloc]
पर कॉल कर सकते हैं अपने स्वयं के अनुकूलन।
मैं सिंगलटन कक्षाओं के लिए alloc ओवरराइड, उदा .:
#import "Singleton.h"
static Singleton * instance;
@implementation Singleton
+ (void)initialize
{
if (!instance) {
instance = [[super allocWithZone:NULL] init];
}
}
+ (id)allocWithZone:(NSZone * const)notUsed
{
return instance;
}
@end
यह आमतौर पर ऐसा करने का एक उचित तरीका नहीं है, क्योंकि आप उन उपयोगकर्ताओं को गलत पहचानते हैं जो '[सिंगलटन न्यू] लिखते हैं कि उन्हें एक नया उदाहरण नहीं मिलेगा। वास्तव में, उदाहरण को एक बार के बजाय दो बार 'init'-ed मिला। इसके बजाय आपको सिर्फ एक + + (instancetype) साझा किया जाना चाहिए; 'क्लास विधि। और 'allocWithZone की सुरक्षा: 'कई उदाहरणों को तुरंत चालू करने के लिए रनटाइम फ़ंक्शंस का उपयोग कर किसी उपयोगकर्ता से आपकी सुरक्षा नहीं करेगा। –
- 1. सी # में स्थापित करने के लिए कक्षा की आवश्यकता है?
- 2. कक्षा को क्रमबद्ध करने के लिए इसकी आवश्यकता क्यों है?
- 3. क्यूटी में बाल वस्तुओं के आवंटन की आवश्यकता क्यों है?
- 4. PHP: क्या कक्षा को विस्तारित करने के लिए नामस्थान को कॉल करने के लिए किसी अन्य 'उपयोग' की आवश्यकता है?
- 5. समानता को सही ढंग से संचालित करने के लिए संरचना में ओवरराइड करने की क्या आवश्यकता है?
- 6. एक्सटेंशन विधियों को कक्षा घोषित करने की आवश्यकता है
- 7. कक्षा में एआरसी की आवश्यकता कैसे है?
- 8. Grails ऐप के लिए जांच करने की क्या आवश्यकता है?
- 9. आवश्यकता को पूरा करने के लिए इंटरफेस या सार कक्षा
- 10. .NET में, क्या DLL को पंजीकृत करने की आवश्यकता है?
- 11. सी # कक्षा को कवर करने के लिए संरचना की आवश्यकता क्यों है?
- 12. जावा या एंड्रॉइड में @ ओवरराइड की आवश्यकता क्यों है?
- 13. PHP में अभिभावक वर्ग को विस्तारित करने के लिए फ़ाइल को कक्षा के साथ फ़ाइल की आवश्यकता होती है?
- 14. आईओएस में [कक्षा नई] और [[कक्षा आवंटन] init] के बीच क्या अंतर है?
- 15. मेरे संवाद के नीले हाइलाइट रंग को बदलने के लिए मुझे किन थीम विशेषताओं को ओवरराइड करने की आवश्यकता है?
- 16. कक्षा के उदाहरण के लिए एक विधि को ओवरराइड करें?
- 17. उसी कक्षा में वर्चुअल विधियों को ओवरराइड करने के लिए Moq का उपयोग
- 18. क्लोजर में 'आवश्यकता' ओवरराइड करना?
- 19. क्यों EnumMap निर्माता को कक्षा तर्क की आवश्यकता है?
- 20. क्या मुझे फ़ाइल को सॉर्ट करने के लिए दूसरी फ़ाइल उत्पन्न करने की आवश्यकता है?
- 21. GetHashCode() को ओवरराइड करने के लिए कब?
- 22. क्या कक्षा में ToString() को स्वचालित रूप से ओवरराइड करने का कोई तरीका है?
- 23. क्या कॉपीराइट तिथियों को अपडेट करने की आवश्यकता है?
- 24. ऑरैकल - क्या बयानों को करने की आवश्यकता है?
- 25. क्यूटी में टैब चौड़ाई को ओवरराइड करने के लिए कैसे?
- 26. क्या मुझे ग्राफिक्स को कॉल करने की आवश्यकता है। प्रदर्शन()?
- 27. क्या मुझे @ सिंथेसाइज को शामिल करने की आवश्यकता है?
- 28. क्या मिडलवेयर ऐप्स को व्यावसायिक तर्क करने की आवश्यकता है?
- 29. क्या .dmg फ़ाइलों को हस्ताक्षरित करने की आवश्यकता है?
- 30. इंटरफ़ेस जिसके लिए विशेषता को लागू करने की आवश्यकता है
क्या केन ने कहा। लेकिन ... जोर देने के लिए ... ऐसा करने के लिए यह बहुत दुर्लभ है। – bbum