2010-09-07 12 views
8

निम्न प्रोग्राम पर विचार करें:NSAutoreleasePool का उपयोग क्यों करें?

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0; 
} 

मुझे समझ में नहीं आ रहा है कि pool की आवश्यकता क्यों है क्योंकि उसी प्रोग्राम को भी इस प्रकार लिखा जा सकता है:

int main (int argc, const char * argv[]) { 
    NSLog(@"Programming is Fun !"); 
    return 0; 
} 

ऑटो रिलीज़ का उपयोग करने का क्या उद्देश्य है पूल? हमें उन्हें कब और कब चाहिए? क्या वे हर उद्देश्य सी कार्यक्रम में अनिवार्य हैं?

अगर मैं किसी ऑब्जेक्ट को ऑटो रिलीज़ नहीं करना चाहता, तो क्या मुझे ऑटो रिलीज पूल का उपयोग करने की भी आवश्यकता है?

उत्तर

7

लेकिन अगर मैं ऑटो रिलीज करने के लिए किसी भी वस्तु नहीं करना चाहते, तो भी मैं ऑटो रिलीज पूल ??

भी ध्यान रखें कि कोको पुस्तकालय autorelease बड़े पैमाने पर उपयोग करता है का उपयोग करने की आवश्यकता है। तो, भले ही आपको लगता है कि आप अपने कोड में पूल का उपयोग नहीं करते हैं, आपको पूल तैयार करने की आवश्यकता है।

5

NSObject एक स्वच्छ समारोह autorelease कहा जाता है। इसका मतलब है उद्देश्य-सी में सभी ऑब्जेक्ट्स इस फ़ंक्शन को शामिल करते हैं।

यह फ़ंक्शन ऑटोरेलीज पूल में self डालें, ऑटोरिज़ पूल को ऑब्जेक्ट के release फ़ंक्शन पर कॉल करने में देरी हो रही है। अधिकांश आंतरिक एपीआई एक ऑटोरेलीज पूल का उपयोग करते हैं, और main() में स्थित एक के बगल में, प्रत्येक पास में UIKit के मुख्य पाश में आवंटित और डिलीकेट किया जाता है।

संक्षेप में: संदर्भ काउंटर में देरी की कमी के लिए यह कतार है। जहां autorelease छिपा हुआ है पर

उदाहरण:

[NSString stringWithUTF8String:"some string"]; 

इस वस्तु आवंटित किया जाता है, और autorelease इस पर कहा जाता है। आप इसे अपने आप कैसे इस्तेमाल करेंगे?

MyObject *obj = [[[MyClass alloc] init] autorelease]; 

यह अच्छा क्यों है? जब आप इस ऑब्जेक्ट को वापस करते हैं, तो कॉलिंग फ़ंक्शन को इस ऑब्जेक्ट को रिलीज़ करने की देखभाल करने की आवश्यकता नहीं होती है, और वैकल्पिक रूप से यह इसे बनाए रख सकता है (लेकिन ऐसा नहीं है)।


विस्तार और चार साल बाद स्पष्ट करने के लिए:

UIKit और AppKit बना सकते हैं और उनके मुख्य runloop के दौरान एक NSAutoreleasePool नाली, अपने गैर जीयूआई कार्यक्रम में एक ओर जहां आप इसे अपने आप को बनाने के लिए की जरूरत है। विभिन्न कोड NSAutoreleasePool मौजूद होने की अपेक्षा करते हैं, और चूंकि आपने एक जीयूआई ढांचा शुरू नहीं किया है और न ही आप एक का उपयोग करते हैं, वहां कोई कोड नहीं है जो आपके लिए जादुई रूप से इसे बनाएगा।

जबकि NSLog() और एक निरंतर NSString अपने उदाहरण एक पूल, यहां तक ​​कि तुच्छ [NSMutableArray array], यह देखते हुए है कि यह वास्तव में [[[NSMutableArray alloc] init] autorelease] रूप में व्याख्या की जा सकती है की आवश्यकता नहीं है में।

0

मुझे कारण मिला है ... "यदि कोई पूल उपलब्ध नहीं है, तो ऑटोरेलेज्ड ऑब्जेक्ट जारी नहीं होते हैं और आप स्मृति को रिसाव करते हैं। इस स्थिति में, आपका प्रोग्राम आमतौर पर उपयुक्त चेतावनी संदेश लॉग करेगा।"

+0

यदि आपको कुछ अन्य उत्तर विशेष रूप से सहायक लगता है, तो इसे "अप" करने के लिए स्वतंत्र महसूस करें, और/या इसे सही के रूप में चिह्नित करें। –

0

आपको आमतौर पर एक ऑटोरेलीज पूल ब्लॉक बनाने की ज़रूरत नहीं है, या यहां तक ​​कि कोड बनाने के लिए उपयोग किए जाने वाले कोड को भी देखना है तीन मौकों जब आप अपने स्वयं के ऑटोरेलीज पूल ब्लॉक का उपयोग कर सकते हैं,

  • यदि आप ऐसे प्रोग्राम लिख रहे हैं जो UI फ्रेमवर्क, जैसे कमांड-लाइन टूल पर आधारित नहीं है।

  • आप एक पाश है कि कई अस्थायी वस्तुओं बनाता लिखते हैं - आप पाश अंदर एक autorelease पूल ब्लॉक का उपयोग अगले चरण से पहले उन वस्तुओं के निपटान के लिए कर सकते हैं। लूप में एक ऑटोरेलीज पूल ब्लॉक का उपयोग करना एप्लिकेशन की अधिकतम मेमोरी पदचिह्न को कम करने में मदद करता है।

  • यदि आप द्वितीयक धागे को जन्म देते हैं - जैसे ही धागा निष्पादित करना शुरू होता है, आपको अपना खुद का ऑटोोरिज़ पूल ब्लॉक बनाना होगा; अन्यथा, आपका आवेदन ऑब्जेक्ट रिसाव करेगा।

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