2014-05-07 8 views
12

मैं जानना चाहता हूं कि एनएसयूटोरिलीपूल और @autoreleasepool ब्लॉक के बीच अंतर क्या हैं। मैं कई प्रश्नों से गुजर चुका हूं लेकिन मुझे कोई संतोषजनक उत्तर नहीं मिला। अब तक मुझे पता चला है कि एआरसी में हम एनएसयूयूटोरिलीपूल का उपयोग नहीं कर सकते हैं और @autoreleasepool ब्लॉक का उपयोग दोनों मामलों में किया जा सकता है। इसलिए इस तरह से व्यवहार करने के लिए वे आंतरिक रूप से अलग-अलग हैं।NSAutoreleasePool और @autoreleasepool ब्लॉक के बीच क्या अंतर है?

, अगर एआरसी रिहाई स्मृति स्वचालित रूप से तो यह आवश्यक NSAutoreleasePool भले ही हम उपयोग कर रहे हैं एक चाप विकलांग वातावरण में वस्तुओं जारी या @autoreleasepool ब्लॉक या वे यह स्वचालित रूप से करना होगा करने के लिए है? इसके अलावा हम क्यों @autoreleasepool का उपयोग ब्लॉक। कृपया मुझे उदाहरण के साथ एक संक्षिप्त अवलोकन दें।

+3

का कहना है कि अगर आप चाप का उपयोग आप NSAutoreleasePool उपयोग नहीं कर सकते आप @autoreleasepool उपयोग करना होगा। Https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html – Sandeep

+0

में मैंने इसे उपरोक्त लिंक में देखा:-महत्वपूर्ण: यदि आप स्वचालित रूप से उपयोग करते हैं संदर्भ गणना (एआरसी), आप सीधे ऑटोरेलीज पूल का उपयोग नहीं कर सकते हैं। इसके बजाय, आप @autoreleasepool ब्लॉक का उपयोग करते हैं। – Imran

+0

संभावित डुप्लिकेट [XCS 4.2 क्यों @autoreleasepool का उपयोग nSAutoreleasePool के बजाय main.m में करता है?] (Http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in- मुख्य-एम-बदले में- nsautoreleasepool) –

उत्तर

7

एक अंतर यह आपका उल्लेख किया:

एआरसी में हम NSAutoreleasePool उपयोग नहीं कर सकते और @autoreleasepool ब्लॉक दोनों एआरसी सक्षम है और विकलांग मामले में इस्तेमाल किया जा सकता है।

लेकिन तुम्हारा के लिए इस कथन:

इसके अलावा, अगर एआरसी रिहाई स्मृति स्वचालित रूप से तो क्यों हम प्रयोग ब्लॉक @autoreleasepool

एआरसी स्मृति स्वचालित रूप से जारी नहीं करता है! यह एक संकलित समय सुविधा है जहां प्रत्येक ऑब्जेक्ट को autorelease भेजा जाता है और यह स्थानीय पूल में जाता है। एक बार इसके जीवनकाल और दायरे खत्म हो जाने के बाद, पूल ओएस खुद को रिलीज़ करता है जिसके परिणामस्वरूप सभी वस्तुओं को छोड़ दिया जाता है।

आप उल्लेख कर सकते हैं इस ब्लॉग Are @autoreleasepool Blocks More Efficient?

यह एक चाप विकलांग पर्यावरण भले ही हम NSAutoreleasePool उपयोग कर रहे हैं या @autoreleasepool ब्लॉक या वे यह स्वचालित रूप से करना होगा में वस्तुओं को रिहा करने के लिए आवश्यक है?

हाँ आपको ऑब्जेक्ट्स को रिलीज़ करने की आवश्यकता है। (@/NS)autoreleasepool की परिभाषा के अनुसार, इसे संभाल नहीं है कि आपके वस्तु मायने रखता है बनाए रखने लेकिन यह केवल के लिए प्रयोग किया जाता है निम्नलिखित:

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

+1

उत्तर के लिए धन्यवाद Anoop.एक और सवाल है यानी वहाँ एक आर्क अक्षम अक्षम वातावरण में वस्तुओं को जारी करना आवश्यक है भले ही हम NSAutoreleasePool या @autoreleasepool ब्लॉक का उपयोग कर रहे हैं या वे इसे स्वचालित रूप से करेंगे? – Imran

2

NSAutoreleasePool कक्षा कोको के संदर्भ-गणना स्मृति प्रबंधन प्रणाली का समर्थन करने के लिए उपयोग किया जाता है। एक ऑटोरेलीज पूल उन ऑब्जेक्ट्स को संग्रहीत करता है जिन्हें पूल 0 डीसंदेश भेजा जाता है जब पूल स्वयं ही निकाला जाता है।

इसके अलावा, यदि आप स्वचालित संदर्भ गणना (एआरसी) का उपयोग करते हैं, तो आप सीधे ऑटोरेलीज पूल का उपयोग नहीं कर सकते हैं। इसके बजाय, आप @autoreleasepool ब्लॉक का उपयोग करते हैं।उदाहरण के लिए, के स्थान पर:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
// Code benefitting from a local autorelease pool. 
[pool release]; 

आप लिखना होगा:

@autoreleasepool { 
    // Code benefitting from a local autorelease pool. 
} 

@autoreleasepool ब्लॉक NSAutoreleasePool सीधे का एक उदाहरण का उपयोग कर से अधिक प्रभावी हैं; यदि आप एआरसी का उपयोग नहीं करते हैं तो भी आप उनका उपयोग कर सकते हैं।

आप और अधिक विस्तार के लिए उल्लेख कर सकते हैं एप्पल दस्तावेज़: डॉक्स सेब से

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html

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