2008-10-08 11 views
25

+[NSThread detachNewThreadSelector:toTarget:withObject:] के लिए दस्तावेज़ का कहना है:NSOperation मुख्य में NSAutoreleasePool?

गैर कचरा-एकत्र अनुप्रयोगों के लिए, विधि aSelector नव अलग थ्रेड के लिए एक autorelease पूल की स्थापना और कि पूल से पहले ही बाहर निकल जाता है मुक्त कराने के लिए जिम्मेदार है।

मेरा प्रश्न है, मैं NSAutoreleasePool के निर्माण NSOperation द्वारा नियंत्रित किया जाता -[NSOperation main] विधि की मेरी ओवरराइड में अपने ही NSAutoreleasePool बनाने की जरूरत है, या?

उत्तर

12

हाँ, आप करते हैं। आप काम के एक आत्मनिर्भर टुकड़े को परिभाषित कर रहे हैं जो NSOperationQueue "कुछ" धागे पर निष्पादित करेगा, इसलिए आप उस कार्य टुकड़े में स्मृति प्रबंधन के लिए ज़िम्मेदार हैं।

2

हां, आप अपने [NSOperation main] विधि में एक NSAutoreleasePool बनाने के लिए, जब तक आप एक "समवर्ती" (थोड़ा दुर्भाग्यपूर्ण नामकरण) NSOperation उपवर्ग पैदा कर रहे है और अपने अधिरोहित [NSOperation start] विधि बुला `[NSOperation मुख्य] ​​से पहले NSAutoreleasePool बनाता है की जरूरत है।

NSOperation कक्षा प्रलेखन में इन सभी का एक अच्छा विवरण है: http://developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

6

आपको अपने मुख्य में अपना स्वयं का एनएसएयूटोरिलीपूल बनाने की आवश्यकता नहीं है, यह सिस्टम आपके लिए करता है। इस देखने के लिए, ब्रेकप्वाइंट विंडो खोलें और टाइप करने के लिए Xcode मेनू आदेश चलाएँ> दिखाएं> ब्रेकप्वाइंट का उपयोग करें: - [NSAutoreleasePool init]

अब अपने कार्यक्रम, चलाने के लिए और आप एक autorelease पूल NSOperation अंदर बनाया जा रहा देखेंगे ।

यह भी देखें, ऐप्पल के उदाहरण, उदाहरण के लिए, http://developer.apple.com/Cocoa/managingconcurrency.html जो अपना स्वयं का ऑटोोरलीज पूल नहीं बनाते हैं।

+0

मुझे लगता है कि अगर आप यहां अन्य टिप्पणियों के आधार पर मुख्य थ्रेड एनएसओपरेशंस नहीं हैं तो आपको लगता है कि। – mxcl

0

हाँ, आपको इसकी आवश्यकता है।

- (void) main 
{ 
    NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init]; 
    //your code here 
    //more code 
    [thePool release]; 
} 

आप एक autorelease पूल, किसी भी convinience वर्ग प्रारंभकर्ता बनाने नहीं है (जैसे [NSString stringWithFormat:]) के रूप में इन initializers autoreleased वस्तुओं वापसी का रिसाव हो जाएगा।

+0

ऐप्पल दस्तावेज़ीकरण के अनुसार, आपको autoreleasePool के लिए रिलीज नहीं करना चाहिए, आपको नाली को कॉल करना चाहिए। –

14

अच्छा सवाल, यहां तक ​​कि ऐप्पल के अपने दस्तावेज़ और उदाहरण कोड इस पर बहुत स्पष्ट नहीं हैं। मेरा मानना ​​है कि मैं हालांकि इस सवाल का जवाब मिल गया है:

क्योंकि संचालन ऑब्जेक्टिव-सी वस्तुओं रहे हैं, तो आप हमेशा एक autorelease पूल अपने कार्य कोड के कार्यान्वयन में जल्दी बनाना चाहिए। एक ऑटोोरिज़ पूल पूल को उद्देश्य-सी ऑब्जेक्ट्स को लीक करने के विरुद्ध प्रदान करता है जो के दौरान आपके कार्य निष्पादन के दौरान ऑटोरेलेटेड हैं। यद्यपि द्वारा आपके कस्टम कोड को निष्पादित करने के समय पहले से ही एक पूल हो सकता है, आपको उस व्यवहार पर कभी भरोसा नहीं करना चाहिए और हमेशा अपना स्वयं का प्रदान करना चाहिए।

मूल रूप से, हालांकि डेविड के अनुसार एक पूल हो सकता है, फिर भी आपको अपना खुद का बनाना चाहिए।