2011-03-04 11 views
12

मैं समझने की कोशिश कर रहा हूं कि ऑटोरेलीज़ को कब कॉल करना है, और यह वास्तव में मेरे ऑब्जेक्ट पर क्या करेगा।उद्देश्य-सी ऑटोरेलीज मेमोरी मैनेजमेंट

मैक डेवलपर लाइब्रेरी में About Memory Management पढ़ने के बाद मुझे समझ में आया कि जब आपके पास एक ऐसी विधि है जो फैक्ट्री विधि के रूप में कार्य करती है - एक नई वस्तु बनाकर और इसे वापस कर - विधि को वापस करने से पहले ऑब्जेक्ट को रिलीज़ करने का कोई तरीका नहीं है, क्योंकि इसके परिणामस्वरूप एक विलुप्त वस्तु वापस आ जाएगी।

उदाहरण

- (Test *) createNewTest 
{ 
    Test *newInstance = [[Test alloc] init]; 
    [newInstance release]; 
    return newInstance; // deallocted object returned. 
} 

इसके बजाय मैं autorelease उपयोग करना चाहिए:

autorelease विधि, NSObject से परिभाषित किया गया, रिसीवर के निशान बाद में

रिलीज के लिए मेरा सवाल यह है: अगर वस्तु बाद में जारी की जानी है, तो मुझे कैसे पता चल जाएगा कि इसे कब जारी किया जा रहा है?

- (Test *) createNewTest 
{ 
    Test *newInstance = [[test alloc] init]; 
    [newInstance autorelease]; 
    return newInstance; 
} 

- (void) runIt 
{ 
    Test *myInstance = [self createNewTest]; 
    // when is myInstance released?? and thereby not valid to my function anymore? 
} 

कैसे मैं सुरक्षित रूप से मेरी runIt विधि के अंदर वापस आ autoreleased वस्तु का उपयोग कर सकते है, तो मैं नहीं जानता कि जब autorelease क्या होता है? क्या मुझे createNewTest द्वारा लौटाई गई वस्तु को बनाए रखना चाहिए? या क्या मैं runIt दायरे में सुरक्षित रूप से इसका उपयोग कर सकता हूं?

+2

btw - obj-c नामकरण दिशानिर्देशों द्वारा आपके निर्माणNewTest विधि को गैर-ऑटोरेलेज्ड ऑब्जेक्ट वापस करना चाहिए क्योंकि इसमें इसके नाम पर 'नया' है। – Vladimir

+0

ऑब्जेक्ट को आवंटित किया जाता है, और इसलिए इसे रिलीज़ करना होगा। – Sailesh

उत्तर

11

एक ऑटोरेलीज्ड ऑब्जेक्ट को ऑटोरेलीज पूल में जोड़ा जाता है।

ऑटोरेलीज पूल में ऑब्जेक्ट मुख्य रनलोप के पुनरावृत्ति के अंत में जारी किए जाते हैं (या यदि आप अपने स्वयं के ऑटोरेलीज पूल का प्रबंधन कर रहे हैं और/या यदि आप नाली कहते हैं)।

जब आप एक विधि है कि एक autoreleased ऑब्जेक्ट कहते हैं, यह बहुत ज्यादा गुंजाइश कम से कम अंत है कि यह में बुलाया गया था जब तक वैध रहने के लिए गारंटी है।

आप यह सुनिश्चित करना है कि यह जीवित रहता चाहते हैं लंबे समय तक आपको इसे बनाए रखना चाहिए, जब आप इसे समाप्त कर लें तो इसे फिर से रिलीज़ करना याद रखें।

+1

आप कहते हैं "बहुत अधिक गारंटी" फैक्ट्री विधि को कॉल करने के तरीके में बनाए रखने और रिलीज करने का सबसे अच्छा अभ्यास है? –

+0

ऑब्जेक्ट अपने दायरे के लिए मान्य रहेगा। यदि आप 100% मस्तिष्क चाहते हैं तो आप बनाए रख सकते हैं/रिलीज़ कर सकते हैं। – Jasarien

+0

आपके उत्तरों के लिए धन्यवाद :) मेरे पास सिर्फ एक और सवाल है, क्या होगा यदि runIt() बनाया गया ऑब्जेक्ट वापस करेगा, जिस तरह से कॉल करने की विधि चलती है() के पास एक सुरक्षित वस्तु भी है :)? –

0

कैसे मैं सुरक्षित रूप से मेरी RUNIT विधि के अंदर वापस आ autoreleased वस्तु का उपयोग कर सकते है, तो मुझे नहीं पता है जब autorelease ट्रिगर?

वर्तमान रन लूप समाप्त होने के बाद Autorelease ट्रिगर होगा।

क्या मुझे createNewTest द्वारा लौटाई गई वस्तु को बनाए रखना चाहिए? या क्या मैं सुरक्षित रूप से इसे चलाने के भीतर इसका उपयोग कर सकता हूं?

आप सुरक्षित रूप से इसे चलाने के अंदर इसका उपयोग कर सकते हैं।

-1

इसे बनाने के लिए जिम्मेदार एक और जिसे चलाने के लिए जिम्मेदार है उसे वस्तु को बनाए रखना है। जब जिम्मेदार व्यक्ति इसके साथ किया जाता है, तो उसे वस्तु को छोड़ देना चाहिए।

0

ऑब्जेक्ट को बनाए रखने और उपयोग के बाद इसे रिलीज़ करना बेहतर है।

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