मान लें कि मैं उद्देश्य-सी में आईफोन के लिए एक नई कक्षा का निर्माण कर रहा हूं। मेरे इनिट विधियों में से एक में मैं कुछ मेमोरी मैन्युअल रूप से आवंटित करना चाहता हूं। यह मानते हुए कि calloc() विफल हो सकता है कि, और कहा कि स्मृति को आबंटित करने में नाकाम रहने मेरी वस्तु के लिए घातक हैमुझे इनिट में विफलता कैसे संभालना चाहिए: उद्देश्य-सी में विधि?
- (id)initWithSomeObject:(SomeObject *)someObject {
self = [super init];
if (self != nil) {
myObject = someObject;
[myObject retain];
if ((memory = calloc(1, sizeof(SomeStruct)) == NULL) {
// What should I do here to clean up
[self release];
self = nil;
}
}
return self;
}
अब, मैं क्या करता है, तो शरीर के अंदर कर साफ करने के लिए करना चाहिए: तो, मैं कुछ इस तरह हो सकता है ठीक से ऊपर? क्या कोई उद्देश्य-सी मुहावरे या पैटर्न है जिसका उपयोग करना चाहिए?
संपादित करें: मैंने रोब नेपियर द्वारा पोस्ट किया गया कोड शामिल किया था। लेकिन, मुझे अभी भी myObject जारी करना है, है ना? या जोड़ा गया कोड किसी भी तरह dealloc() ट्रिगर करता है?
इस बारे में चिंता न करें कि यह dealloc() को ट्रिगर करता है या नहीं। यह करता है, लेकिन यह बात नहीं है। मुद्दा यह है कि [स्वयं रिलीज] पहले कॉल को + ऑलोक पर संतुलित करता है, इसलिए आपके सभी आवश्यक रिलीज किए गए हैं और सिस्टम अब उचित समय पर विलुप्त होने का ख्याल रखेगा। ज्यादातर मामलों में, "उचित समय" की संभावना जल्द ही [स्वयं रिलीज] कहलाती है, लेकिन बाद में यदि कोई लंबित ऑटोरेलीज़ हो तो यह हो सकता है। लेकिन उपरोक्त कोड सही है और कुछ और आवश्यक नहीं है। –
एक साइड नोट के रूप में: यह मेरी समझ है कि कॉलोक/मॉलोक कभी भी वापस नहीं लौटाएगा, जब आप स्मृति से बाहर या कम हो जाते हैं तो सिस्टम सिर्फ आपके ऐप को मार देगा। मुझे लगता है कि ऐप्पल ने यह पाया कि ऐसा करना आसान था, फिर ऐप को अनचेक नल/शून्य पॉइंटर्स से क्रैश कर रहा है। –