मैं समझने की कोशिश कर रहा हूं कि ऑटोरेलीज़ को कब कॉल करना है, और यह वास्तव में मेरे ऑब्जेक्ट पर क्या करेगा।उद्देश्य-सी ऑटोरेलीज मेमोरी मैनेजमेंट
मैक डेवलपर लाइब्रेरी में 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
दायरे में सुरक्षित रूप से इसका उपयोग कर सकता हूं?
btw - obj-c नामकरण दिशानिर्देशों द्वारा आपके निर्माणNewTest विधि को गैर-ऑटोरेलेज्ड ऑब्जेक्ट वापस करना चाहिए क्योंकि इसमें इसके नाम पर 'नया' है। – Vladimir
ऑब्जेक्ट को आवंटित किया जाता है, और इसलिए इसे रिलीज़ करना होगा। – Sailesh