2011-03-06 9 views
5

आईओएस/कोको टच पर मैं अक्सर कोड देखता हूं जो एक विधि के भीतर NSAutoreleasePool का एक नया उदाहरण बनाता है। मैंने हाल ही में एक एनएसओपरेशन के भीतर देखा।NSAutoreleasePool। एक नया ऑटोरेलीज पूल बनाने के लिए कब उचित है?

NSAutoreleasePool का एक नया उदाहरण स्थापित करने के लिए ग्राउंड नियम क्या हैं? Main.m में बनाए गए पूर्व-मौजूदा रिलीज़ पूल पर निर्भर रहने के लिए यह बेहतर क्यों है?

धन्यवाद,
डौग

उत्तर

6

आप जब चाहें तब एक नया autorelease पूल का उपयोग कर सकते, लेकिन यह हमेशा फायदेमंद नहीं है। जब भी आप एक नया थ्रेड शुरू करते हैं या उस थ्रेड में स्वत: ऑब्जेक्ट ऑब्जेक्ट की आवश्यकता होती है तो यह आवश्यक होता है। एक ऐसी विधि में नए ऑटोरेलीज पूल बनाने के लिए भी आम बात है जहां आप बड़ी संख्या में ऑब्जेक्ट्स बनाते हैं और ऑटोरेलीज करते हैं। उदाहरण के लिए, यदि आपके पास एक लूप था जिसने 50 पुनरावृत्तियों में से प्रत्येक में 10 ऑब्जेक्ट बनाए हैं, तो आपको उस विधि के लिए एक ऑटोरेलीज पूल बनाने पर विचार करना चाहिए, यदि लूप के हिस्से के रूप में नहीं है ताकि प्रत्येक पुनरावृत्ति के लिए कोई नया बनाया जा सके।

+0

स्थानीय ऑटोरेलीज पूल कब फायदेमंद नहीं होता है। मैं एक बनाने के लिए प्रेरणा इकट्ठा करता हूं ठीक दानेदार mems प्रबंधन के लिए है। साथ ही, आप बताते हैं कि नए धागे के लिए एक नया ऑटोोरिज़ पूल बनाया जाना चाहिए। क्या यह NSOperations के लिए सच है? मैं एक कट्टरपंथी परीक्षक हूं और अपने वर्तमान एनएसओपरेशंस के साथ कोई ज्ञापन रिसाव नहीं देखता हूं जिसमें स्थानीय ऑटोरेलीज पूल की कमी है। – dugla

+0

@dugla मुझे यकीन नहीं है कि आपको NSOperations के लिए एक बनाने की आवश्यकता है या नहीं। जब किसी ऑब्जेक्ट को पूल के बिना ऑटोरेलेटेड किया जाता है, तो यह कंसोल को एक संदेश प्रिंट करता है, इसलिए आपको पता होना चाहिए कि आपको एक की आवश्यकता है या नहीं। यदि आप अपने जीवनकाल के दौरान बहुत सारी वस्तुएं नहीं बनाते हैं तो पूल बनाना फायदेमंद नहीं है क्योंकि यह अतिरिक्त आवंटन जोड़ रहा है और प्रोसेसर चक्र ले रहा है। इसका कोई लाभ नहीं हो सकता है जब तक कि आप अपने जीवनकाल के दौरान उद्देश्य-सी वस्तुओं का उपयोग न करें, क्योंकि अन्य वस्तुएं इसका उपयोग नहीं करती हैं। – ughoavgfhw

3

अपना स्वयं का पूल बनाएं जब पहले से कोई स्थान नहीं है (जैसे कि एक नए थ्रेड में), या जब रन लूप में कोई पर्याप्त नहीं है (कई लूप में ऑटोरेलेज्ड ऑब्जेक्ट्स बनाना जो कई के लिए चलाएगा पुनरावृत्तियों), या जब आप अपने द्वारा बनाए गए ऑटोरेलेज्ड ऑब्जेक्ट्स को अंततः जारी किए जाने पर नियंत्रण में वृद्धि करना चाहते हैं।

1

मैंने आईओएस 4.3 में परीक्षण किया और प्रदर्शन निष्पादक निष्पादन निष्पादित करते समय आपको अपने ऑटोरेलीज पूल बनाने की आवश्यकता है। NSOperation या dispatch_async का उपयोग करते समय आपको बनाने की आवश्यकता नहीं है।

आईओएस में लगता है> = 5.0 सिस्टम का उपयोग स्वचालित रूप से ऑटोरेलीज पूल बनाता है भले ही निष्पादक इनबैकग्राउंड का उपयोग करें, इसलिए जब आप अपना ऑटोरेलीज पूल बनाने की आवश्यकता होती है तो मैं कोई केस नहीं ढूंढ पा रहा था।

उस परिवर्तन को दस्तावेज करने में असमर्थ था, हालांकि।