2011-09-16 12 views
5

AFAIK, __block जब आप बदल रहे हैं, ब्लॉक के अंदर, पता है कि एक चर (ब्लॉक के बाहर घोषित) पता चलता है।क्या एआरसी मुझे बताएगा कि मुझे __block का उपयोग कब करना चाहिए?

लेकिन, अगर मैं वैरिएबल पॉइंट्स को उस मान को बदल रहा हूं लेकिन पॉइंटर वही रहता है? उदा।, अगर मेरे पास NSMutableArray *array है और क्या मैं ब्लॉक के अंदर [array addObject:object] कर रहा हूं? इस मामले में, मैं सूचक array नहीं बदल रहा हूं, लेकिन मैं उस मान को बदल रहा हूं जो इसे इंगित करता है। तो, क्या मुझे अभी भी का उपयोग NSMutableArray *array घोषित करने में करना चाहिए?

उत्तर

19

यदि आप चर के मान को बदल रहे हैं तो आपको केवल __block की आवश्यकता है।

आईई। यदि आपके पास:

NSArray* foo; 

आप केवल __block जरूरत है अगर आप foo का मूल्य बदल जाते हैं। अब, ध्यान रखें कि foo "NSArray टाइप की गई किसी चीज़ के सूचक" से अधिक कुछ नहीं है। अर्थात। प्लेटफ़ॉर्म के आधार पर foo प्रभावशाली रूप से 64 बिट या 32 बिट पूर्णांक है। यदि आप उस पूर्णांक को बदलते हैं, तो आपको __block की आवश्यकता है। यदि आप नहीं करते हैं, तो आपको __block की आवश्यकता नहीं है।

तो, नहीं, आपको __block को सरणी पर addObject: पर कॉल करने की आवश्यकता नहीं है क्योंकि आप वास्तव में foo के मान को नहीं बदल रहे हैं।

यदि आप foo = (expression); जैसे कुछ करना चाहते हैं, तो आपको __block की आवश्यकता होगी।

(ध्यान दें कि इस कारण OO तहत समवर्ती प्रोग्रामिंग इतनी मेहनत शापित है में से एक है ... यह किसी भी निष्पादन पथ के लिए "विचरण के डोमेन" को परिभाषित करने के असाधारण कठिन है)

+0

संकलक अनुकूलन के बारे में क्या ? '__block' यह संकेत दे सकता है कि कोई ऑब्जेक्ट कभी नहीं बदलता है, और यदि' NSArray' को रेखांकित किया गया था, तो क्षमता के बाद की कॉल गलत हो सकती है। – Dani

+2

'__block' इंगित करता है कि चर बदल सकता है। चर यानी '__block' या एक कॉन्स्ट-कॉपी (जैसा डिफ़ॉल्ट है) है, ऑब्जेक्ट पर एक विधि को कॉल करने पर कोई प्रभाव नहीं पड़ेगा। – bbum

+0

लेकिन क्या होता है यदि चर (एनएसएआरएआरई *) एक स्व संपत्ति है? क्या __block को जोड़ा जाना चाहिए? – Amnysia