2012-08-04 15 views
5

आईओएस ऐप विकास में, हम समय पर बाद में ऑब्जेक्ट्स के स्वामित्व को छोड़ने के लिए NSAutoreleasePool का उपयोग कर रहे हैं।हमें प्रत्येक थ्रेड के लिए एनएसएयूटोरिस्लीपूल का उपयोग करने की आवश्यकता क्यों है?

लेकिन इसे विभिन्न धागे के बीच क्यों साझा किया जा सकता है?

जब मैं एक नया धागा उपयोग करना चाहता था तो हमें एक नया ऑटोोरिज़पूल बनाने की आवश्यकता क्यों है?

संपादित करें:

रूप taskinoor उल्लेख मेरे सवाल क्यों यह इस तरह से है कि प्रत्येक धागा एक अलग autoreleasepool होना चाहिए में बनाया गया है था।

+1

[यह प्रश्न आपके प्रश्न से बहुत संबंधित प्रतीत होता है] (http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) –

+1

आपको '@ autoreleasepool {...} '' NSAutoreleasePool' के बजाय। दस्तावेज़ीकरण के अनुसार, यह अधिक कुशल है। और यदि आप एआरसी में माइग्रेट करते हैं, तो यह अनिवार्य है। –

+0

मुझे नहीं पता कि आपको उस संपादन की आवश्यकता क्यों है, मेरा जवाब इसके कारण बताता है :) –

उत्तर

5

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

+1

इसे एक कदम आगे ले जाएं; यदि कोई थ्रेड किसी भी चीज़ के लिए इंतजार कर रहा है - नेटवर्क, थ्रेड स्टेट, अन्य I/O - तो कुल पूल को निकाला नहीं जा सका। – bbum

0

मुझे नहीं लगता कि autorelease पूल, धागे के बीच साझा कर रहे हैं apples memory management guide कोको में प्रत्येक थ्रेड autorelease पूल

के अपने स्वयं के ढेर है आप धागे जो आप बना सकते हैं या के लिए एक autorelease पूल नहीं बना रहे हैं तो के अनुसार अलग करें, तो ऑटोरेलीज फ़ंक्शन काम नहीं करता है, इसलिए मेमोरी पदचिह्न

2

प्रत्येक थ्रेड एक अलग निष्पादन संदर्भ है - एक धागा जल्दी या बाद में बाहर निकल सकता है, वे अलग-अलग जीवनकाल और स्मृति प्रबंधन आवश्यकताओं के साथ विभिन्न संसाधनों का उपयोग कर सकते हैं, इसलिए प्रत्येक धागा स्वतंत्र रूप से प्रबंधित किया जाना चाहिए।

1

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

+0

धन्यवाद टास्किनूर – Krishnan

+1

अच्छा अनुमान है, लेकिन अपूर्ण है। Autorelease पूल प्रति थ्रेड होना चाहिए क्योंकि पूल के बिना सुरक्षित रूप से पूल को निकालने का कोई तरीका नहीं होगा * सभी राज्यों में जहां उनके पूल को निकाला जा सकता है। यदि * कोई धागा * इनपुट के लिए इंतजार कर रहा है, तो नाली नहीं हो सका। जेफरी का जवाब सही है। – bbum

+1

@bbum, धन्यवाद। मैंने पूल को निकालने के बारे में नहीं सोचा और मैं मानता हूं कि जेफ़री का जवाब मेरे से बेहतर है। – taskinoor

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