निम्नलिखित कोड पर विचार करें:एक ब्लॉक शाब्दिक संदर्भित संपर्क करना चाहिए ढेर-आवंटित ब्लॉकों
// t included so block1 is a stack block. See [1] below
int t = 1;
SimpleBlock block1 = ^{ NSLog(@"block1, %d", t); };
// copy block1 to the heap
SimpleBlock block1_copied = [block1 copy];
// block2 is allocated on the stack, and refers to
// block1 on the stack and block1_copied on the heap
SimpleBlock block2 = ^{
NSLog(@"block2");
block1_copied();
block1();
};
[block1_copied release];
// When the next line of code is executed, block2_copied is
// allocated at the same memory address on on the heap as
// block1_copied, indicating that block1_copied has been
// deallocated. Why didn't block2 retain block1_copied?
SimpleBlock block2_copied = [block2 copy];
block2_copied();
[block2_copied release];
कहाँ, पूर्णता के लिए, SimpleBlock द्वारा परिभाषित किया गया है:
typedef void (^SimpleBlock)(void);
कोड में टिप्पणी ने संकेत के रूप में , मेरे परीक्षण (जीसीसी 4.2 और एलएलवीएम 2.0 दोनों का उपयोग करके) दिखाते हैं कि ब्लॉक 1_copied उस समय तक अवरुद्ध है [ब्लॉक 2 प्रतिलिपि] कहा जाता है, फिर भी मैंने जो दस्तावेज पढ़ा है [1,3], ब्लॉक उद्देश्य-सी ऑब्जेक्ट्स और ब्लॉक हैं उद्देश्य-सी ऑब्जेक्ट्स को बनाए रखें जिनके लिए वे संदर्भित करते हैं [2] (गैर-आवृत्ति परिवर्तनीय सी में ase)।
इसके अतिरिक्त, ध्यान दें कि जब ब्लॉक 2 की प्रतिलिपि बनाई जाती है, तो ब्लॉक 1 का संदर्भ ब्लॉक 1 की एक नई प्रति (जिसे ब्लॉक 1_copied से अलग है) के संदर्भ में भी बदला जाता है, क्योंकि ब्लॉक किसी भी ब्लॉक को कॉपी करते हैं [ 2]।
तो, यहाँ क्या हो रहा है?
ए) ब्लॉक उद्देश्य-सी वस्तुओं पर वे उल्लेख करने के लिए बनाए रखने और ब्लॉक उद्देश्य-सी वस्तुओं रहे हैं, तो क्यों block2 से पहले पुनः आवंटित की जाती block1_copied है दायरे से बाहर चला जाता है?
बी) यदि ब्लॉक ब्लॉक की प्रतिलिपि बनाते हैं, और यदि भेजते हैं - (आईडी) एक ढेर-आवंटित ब्लॉक में प्रतिलिपि बनाते हैं तो वास्तव में इसकी बरकरार संख्या में वृद्धि होती है, ब्लॉक 2 से पहले ब्लॉक 2_copied क्यों हटाया जाता है?
सी) यदि यह अपेक्षित व्यवहार है, जहां प्रलेखन है कि यह बताता है?
[1] http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html
[2] http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html
[3] http://clang.llvm.org/docs/BlockLanguageSpec.txt
पाद-टिप्पणी: मेरी परीक्षणों में इस कोड को चलाने का परिणाम एक असीम पुनरावर्ती block2_copied लिए() कॉल, block1_copied के बाद से (है) ब्लॉक 2_copied के रूप में एक ही स्मृति पता था।
+1 दिलचस्प .... –