2010-11-10 10 views
73

आम तौर पर, यदि आप पृष्ठभूमि धागे को जन्म देते हैं या NSOperationQue पर NSOperation चलाते हैं तो आपको उस थ्रेड या ऑपरेशन के लिए NSAutoreleasePool बनाने की आवश्यकता होती है क्योंकि डिफ़ॉल्ट रूप से कोई भी मौजूद नहीं है।क्या आपको जीसीडी में एक ब्लॉक के भीतर एनएसएयूटोरिलीपूल बनाने की ज़रूरत है?

क्या वही नियम ग्रैंड सेंट्रल डिस्पैच कतार में रखे गए ब्लॉक पर लागू होता है और इसे गैर-मुख्य धागे पर चलाया जाएगा? यही है, क्या आपको मुख्य कतार के अलावा किसी अन्य चीज़ पर प्रेषित प्रत्येक ब्लॉक के भीतर एक NSAutoreleasePool बनाने की आवश्यकता है?

मेरे सीमित परीक्षण में, मुझे ऑटोरेलेज्ड ऑब्जेक्ट्स के लिए कंसोल चेतावनियां दिखाई नहीं देती हैं जिन्हें आप सामान्य रूप से पृष्ठभूमि धागे या NSOperations के साथ देखते हैं। हालांकि, मुझे इस पर निश्चित दस्तावेज नहीं मिल रहा है, इसलिए मैं सोच रहा था कि कोई कहां बता सकता है कि यह कहां कहा गया है।

+0

जवाब @Gustavo Ambrozio द्वारा पोस्ट की गई जो हटा दिया गया था से, [प्रलेखन यहाँ है] (http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues। एचटीएमएल # // apple_ref/doc/uid/TP40008091-CH102-SW17), यदि किसी भी दर्शक रुचि रखते हैं। – iDev

उत्तर

107

यही नियम एक ब्लॉक कि एक ग्रांड सेंट्रल डिस्पैच कतार भीतर रखा और एक गैर मुख्य थ्रेड पर चलाया जाएगा है करने के लिए लागू होता है? यही है, क्या आपको को के भीतर एनएसयूयूटोरिलीपूल बनाने के लिए मुख्य कतार के अलावा पर भेजे गए प्रत्येक ब्लॉक की आवश्यकता है?

ग्रांड केंद्रीय प्रेषण प्रति कतार स्वचालित रूप से एक ऑटोरेलीज पूल का प्रबंधन करेगा। हालांकि, इस बात की कोई गारंटी नहीं है कि पूल कब निकाला जाएगा; यह एक ब्लॉक संसाधित होने के बाद हो सकता है, यह सैकड़ों के बाद हो सकता है (लेकिन शायद नहीं होगा)।

तो, यदि आप केवल कुछ ऑब्जेक्ट्स आवंटित कर रहे हैं, तो इसके बारे में चिंता न करें। हालांकि, यदि आप किसी भी महत्वपूर्ण वस्तु को आवंटित कर रहे हैं (और चूंकि आप स्मृति बाधित वातावरण को लक्षित कर रहे हैं), तो आपको पूल बनाना और निकालना चाहिए।


दस्तावेज़ीकरण अद्यतन किया गया है।

देखें https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

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

+3

+1 यह कहीं भी प्रलेखन में है? –

+6

स्पष्ट रूप से पर्याप्त नहीं है। दस्तावेज़ीकरण बग दायर ()। – bbum

+3

उत्कृष्ट। स्पष्टीकरण के लिए धन्यवाद। –

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

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