objective c - Blocks retain cycle from naming convention? -
मुझे निम्नलिखित व्यवहार को खोजने के लिए आश्चर्य है ...
@interface Foo: NSObject - (शून्य) ऐडबार: (आईडी) के साथ एबर सम्मिलित करें: (शून्य (^) (शून्य)) पूर्णता; @ अंत @ इंटरफेस AwesomeClass: NSObject @property (मजबूत, nonatomic) Foo * foo; - (शून्य) doSomethingWithBar: (आईडी) बार; @end @implementation AwesomeClass - (शून्य) doSomethingWithBar: (आईडी) बार {[self.foo addBar: बार के साथ समाप्ति: ^ {NSLog (@ "% @", self.foo); }]; } एक्सकोड 4.6.1 में मुझे -doSomethingWithBar: के कार्यान्वयन में एक चेतावनी मिली है कि "इस खंड में स्वयं को" कैप्चरिंग "दृढ़ता से आगे बढ़ने की संभावना है एक बनाए चक्र। " हालांकि, यदि मैं नाम विधि का -addBar: withCompletion: से -setupBar: withCompletion: यह चेतावनी दूर जाती है ऐसा लगता है कि इस पर मेरा आश्चर्यजनक वर्णन है कि मुझे उद्देश्य- C नामकरण सम्मेलनों के बारे में अपने ज्ञान में अंतर मिला है!
कोड
[self.foo someMethod: बार के साथ समाई: ^ {NSLog (@ "% @", self.foo); }]; आमतौर पर एक बनाए रखने के चक्र नहीं बनाए जाते अगर कुछ विधि: समापन के साथ: बस ब्लॉक और रिटर्न कॉल करता है, इसमें कोई भी चक्र नहीं रहता है ( - [NSArray enumerateObjectsUsingBlock:] एक उदाहरण है।) केवल तभी कुछ विधि: के साथ समाई: ब्लॉक को बाद में निष्पादित करने के लिए "याद रखता है" एक संभव बनाए रखने चक्र है तो झगड़ा यह तय करने के लिए एक अनुमान लगाता है कि क्या यह "सेटर-जैसी" विधि है जो ब्लॉक को Foo की संपत्ति में बाद में निष्पादित करने के लिए संग्रहीत करता है। -set & lt ; कुंजी & gt; और -add & lt; की & gt; एक संपत्ति सेट करने के लिए या (बहुत से) रिश्तों को एक मूल्य जोड़ने के लिए कुंजी-मान कोडन में एक्सेसर पैटर्न होते हैं, और वह वास्तव में क्या है
'। स्थैतिक बूल है सैटरलेइक चयनकर्ता (चयनकर्ता) (यदि (sel.isUnarySelector ()) गलत लौटा; स्ट्रिंगआरफ str = sel.getNameForSlot (0); जबकि (! Str.empty () और amp; str.front () == '_') str = str.substr (1); अगर (str.startswith ("set")) str = str.substr (3); और अगर (str.startswith ("add")) {// विशेष रूप से श्वेतसूची 'addOperationWithBlock:'। अगर (sel.getNumArgs () == 1 & amp; amp; स्ट्रैपरस्टास्ट के साथ ("addOperationWithBlock")) गलत लौटा; Str = str.substr (3); } और झूठी वापसी; यदि (str.empty ()) सत्य वापस; वापसी! इज़्लॉवर (str.front ()); }
जिसे यहां कहा जाता है:
/// एक सन्दर्भ भेजने के लिए यह देखने के लिए जांचें कि क्या यह एक बनाए रखने के चक्र का कारण हो सकता है। शून्य सेमा :: चेकराइनेट कैचाल (ओबीसीएमएजेसएक्सप्रोम * msg) {// केवल उदाहरण के तरीकों की जांच करें जिनकी चयनकर्ता सेटर की तरह दिखता है अगर (! Msg- & gt; इन्स्टेंस मेसेज () है!! है सैटरलेइक चयनकर्ता (msg- & gt; प्राप्तकर्ता ()) लौट आए; "Setter-like" पद्धति के रूप में माना जाता है क्योंकि "सेट" या / * * बाकी छूट * /} आपका setupBar विधि नहीं एक अपरकेस अक्षर द्वारा पीछा नहीं किया जाता है।
Comments
Post a Comment