2010-01-06 8 views
24

मान लें कि मैं उद्देश्य-सी में आईफोन के लिए एक नई कक्षा का निर्माण कर रहा हूं। मेरे इनिट विधियों में से एक में मैं कुछ मेमोरी मैन्युअल रूप से आवंटित करना चाहता हूं। यह मानते हुए कि 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() ट्रिगर करता है?

+2

इस बारे में चिंता न करें कि यह dealloc() को ट्रिगर करता है या नहीं। यह करता है, लेकिन यह बात नहीं है। मुद्दा यह है कि [स्वयं रिलीज] पहले कॉल को + ऑलोक पर संतुलित करता है, इसलिए आपके सभी आवश्यक रिलीज किए गए हैं और सिस्टम अब उचित समय पर विलुप्त होने का ख्याल रखेगा। ज्यादातर मामलों में, "उचित समय" की संभावना जल्द ही [स्वयं रिलीज] कहलाती है, लेकिन बाद में यदि कोई लंबित ऑटोरेलीज़ हो तो यह हो सकता है। लेकिन उपरोक्त कोड सही है और कुछ और आवश्यक नहीं है। –

+0

एक साइड नोट के रूप में: यह मेरी समझ है कि कॉलोक/मॉलोक कभी भी वापस नहीं लौटाएगा, जब आप स्मृति से बाहर या कम हो जाते हैं तो सिस्टम सिर्फ आपके ऐप को मार देगा। मुझे लगता है कि ऐप्पल ने यह पाया कि ऐसा करना आसान था, फिर ऐप को अनचेक नल/शून्य पॉइंटर्स से क्रैश कर रहा है। –

उत्तर

26

हां, आपको स्वयं को छोड़ना चाहिए और फिर nil वापस करना चाहिए।

[self release]; 
self = nil; 

ऑब्जेक्टिव-सी प्रोग्रामिंग गाइड में अवधारणाओं में Issues with Initializers देखें।

3

आपको जिस चीज की आवश्यकता है उसे साफ़ करने की आवश्यकता है और फिर nil पर स्वयं संदर्भ सेट करना होगा।

Link

+0

गीज़ - कम से कम एक टिप्पणी छोड़ दें जब आप डाउनवोट करते हैं! – psychotik

+0

स्वयं को जारी करने के लिए मत भूलना, या आप रिसाव करेंगे। (कोई विचार नहीं है कि किसने डाउनवॉट किया; आप सही हैं)। –

1

मैं बस की कोशिश की: एप्पल देव पोर्टल एक लेख है। -dealloc को [self release] के कारण बुलाया जाता है, इसलिए myObject को initWithSomeObject में रिलीज़ होने की आवश्यकता नहीं होगी। यह सुनिश्चित करने के लिए, आप myObject = [someObject retain]; स्थानांतरित कर सकते हैं (मैं -retain किसी कारण से असफल हो सकता है) उस कॉल के नीचे विफल हो सकता है (यदि यह संभव हो)।

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