2009-09-03 14 views
5

this question के कुछ उत्तरों के आधार पर ऐसा लगता है कि + ऑलोक उद्देश्य-सी में किसी ऑब्जेक्ट के उदाहरण के लिए मेमोरी आवंटित करने के लिए कुछ पीछे के दृश्य जादू करता है। क्या कभी भी ऑलोक ओवरराइड करने की ज़रूरत है?क्या उद्देश्य-सी में + आवंटन को ओवरराइड करने के लिए कक्षा की आवश्यकता है?

+0

क्या केन ने कहा। लेकिन ... जोर देने के लिए ... ऐसा करने के लिए यह बहुत दुर्लभ है। – bbum

उत्तर

7

यह काफी दुर्लभ है।

एनएसएसटींग एक वर्ग का एक उदाहरण है जो कार्यान्वयन विस्तार के रूप में + आवंटित ओवरराइड करता है। यदि आप जांचना चाहते थे, तो आपको + NSString alloc] क्लास NSPlaceholderString का कुछ रिटर्न मिलेगा। यह स्ट्रिंग class cluster के कार्यान्वयन का हिस्सा है।

आप एक अलग आवंटन एनएसजेडोन से डिफ़ॉल्ट रूप से आवंटित करने के लिए ओवरराइड भी कर सकते हैं। या, आप NSAllocateObject पर अपने इवर के बाद गतिशील मात्रा प्रदान करने के लिए extraBytes के लिए कुछ शून्य के साथ कॉल करने जैसी चालें चला सकते हैं। उदाहरण के लिए, आप सोच सकते हैं कि NSString के निजी उपवर्ग है कि आप सामान्य रूप से अंत कुछ इस तरह दिखेगा:

@interface { 
    NSUInteger length; 
    unichar *data; 
} 

लेकिन यह है कि ऐसा नहीं है। यह स्मृति का एक एकल ब्लॉक है जिसमें लंबाई और वर्ण डेटा दोनों शामिल हैं। विभिन्न एनएसएसटींग उदाहरण स्मृति के विभिन्न आकार ब्लॉक हैं। यह ऐसी चीज है जिसे आप सीधे एनएसएएलओएलओटीओब्जेक्ट को कॉल करके व्यवस्थित कर सकते हैं।

लेकिन ये सभी चीजें चाल और हैक्स हैं। यदि आप + ऑलोक ओवरराइड करते हैं, तो कुछ खास चल रहा है।

4

+alloc कोई जादू नहीं कर रहा है, यह केवल क्लास इंस्टेंस के आकार को प्राप्त करने और स्मृति की मात्रा आवंटित करने के लिए उद्देश्य-सी रनटाइम में एक विधि को कॉल कर रहा है। एक सच्चे सिंगलटन लिखते समय आप +alloc को ओवरराइड करना चाहते हैं (यानी आप गारंटी देना चाहते हैं कि आपकी कक्षा का केवल एक ही उदाहरण आवंटित किया जा सकता है)। हालांकि सिंगलटन कक्षा लिखते समय इन लंबाईों पर जाना शायद ही कभी आवश्यक है, आप कर सकते हैं। सामान्य रूप से आप विकल्प प्रदान करने के लिए +alloc ओवरराइड करेंगे (जैसे किसी भिन्न क्षेत्र में स्मृति आवंटित नहीं करना, प्राप्त वर्ग की तुलना में एक अलग वर्ग आवंटित करना - यह क्लास क्लस्टर क्या कर सकता है) व्यवहार या आप मानक काम करने के लिए +[super alloc] पर कॉल कर सकते हैं अपने स्वयं के अनुकूलन।

1

मैं सिंगलटन कक्षाओं के लिए 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 
+0

यह आमतौर पर ऐसा करने का एक उचित तरीका नहीं है, क्योंकि आप उन उपयोगकर्ताओं को गलत पहचानते हैं जो '[सिंगलटन न्यू] लिखते हैं कि उन्हें एक नया उदाहरण नहीं मिलेगा। वास्तव में, उदाहरण को एक बार के बजाय दो बार 'init'-ed मिला। इसके बजाय आपको सिर्फ एक + + (instancetype) साझा किया जाना चाहिए; 'क्लास विधि। और 'allocWithZone की सुरक्षा: 'कई उदाहरणों को तुरंत चालू करने के लिए रनटाइम फ़ंक्शंस का उपयोग कर किसी उपयोगकर्ता से आपकी सुरक्षा नहीं करेगा। –

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

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