2013-02-03 36 views
45

संभव डुप्लिकेट:
Why use Autorelease pool?autoreleasepool क्या है?

सभी ऑब्जेक्टिव-सी प्रारंभिक पृष्ठ मुख्य कार्य घोषणा के तहत एक डिफ़ॉल्ट @autoreleasepool{...} बयान के साथ खुलता है। लेकिन वास्तव में यह कथन क्या कर रहा है? नया उद्देश्य-सी स्वचालित रूप से ऑब्जेक्ट्स को रिलीज़ करता है और लाइन को हटाने से प्रोग्राम में कुछ भी नहीं बदलता है। क्या यह आदेश वास्तव में आवश्यक है?

+0

या हो सकता है http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –

उत्तर

71

@autoreleasepool कथन NSAutoreleasePool कक्षा का उपयोग करने के बजाय पहले जैसा ही काम कर रहा है। जिस तरह से NSAutoreleasePool काम करता था वह थोड़ा अजीब था, क्योंकि इसे पूरे एप्लिकेशन में प्रभाव पड़ा; @autoreleasepool एक स्कोप्ड क्षेत्र बनाता है और पूल के भीतर क्या होता है और जब यह निकलता है (जब यह गुंजाइश से बाहर हो जाता है) को स्पष्ट करता है। ऐप्पल के मुताबिक यह और भी कुशल है।

एक ऑटोरेलीज पूल की अवधारणा सरल है, जब भी ऑब्जेक्ट इंस्टेंस को ऑटोरेलेज्ड के रूप में चिह्नित किया जाता है (उदाहरण के लिए NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];), उस समय उस समय +1 की एक गिनती गिनती होगी, लेकिन रन लूप के अंत में , पूल निकाला जाता है, और किसी ऑब्जेक्ट को ऑटोरेलीज़ चिह्नित किया जाता है, फिर इसकी गिनती की कमी घट जाती है। जब आप इसे तैयार करेंगे, तब भी ऑब्जेक्ट को चारों ओर रखने के लिए यह एक तरीका है।

एआरसी के साथ, जबकि autorelease कीवर्ड डेवलपर द्वारा उपयोग नहीं किया जाता है, अंतर्निहित प्रणाली जो आपके लिए एआरसी आवेषण का प्रबंधन करती है। (याद रखें: सभी एआरसी कर रहे हैं retain, release और autorelease उचित समय पर आपके लिए कॉल करते हैं)। इस वजह से, मौजूदा AutoreleasePool अवधारणा को रहने की जरूरत है।

आप autorelease पूल निकालते हैं, तो आपके वस्तुओं

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

+0

इसका मतलब यह है कि अगर मैं एआरसी का उपयोग करता हूं और @autoreleasepool {} 'के बाहर कहीं से ऑब्जेक्ट जारी करता हूं, ऑब्जेक्ट अभी भी @autoreleasepool ब्लॉक के अंत तक मौजूद है? – confile

+2

यदि आप ऑटोरेलीज़ ऑब्जेक्ट को मैन्युअल रूप से रिलीज़ करते हैं, तो जब आप ऑटोरेलीज पूल के अंत को दबाते हैं तो dealloc'd ऑब्जेक्ट अब मौजूद नहीं होगा और आप फ्रेमवर्क या मशीन कोड में कहीं भी अपवाद को दबाएंगे। यदि यह कोड का लंबा मार्ग है, तो आपका ऐप एक असंभव असंबंधित स्थान पर भ्रम पैदा कर सकता है जो भ्रम पैदा कर रहा है। – jcpennypincher