KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
Consider the following code: // 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]; Where, for completeness, SimpleBlock is defined by: typedef void (^SimpleBlock)(void); As indicated by the comment in the code, my tests (using both GCC 4.2 and LLVM 2.0) show that block1_copied is deallocated by the time [block2 copy] is called, yet according to the documentation that I have read [1,3], blocks are objective-c objects and blocks retain objective-c objects to which they refer [2] (in the non-instance variable case). Additionally, note that when block2 is copied, its reference to block1 is also changed to a reference to a new copy of block1 (which is different than block1_copied), as expected, since blocks copy any blocks to which they refer [2]. So, what's going on here? A) If blocks retain objective-c objects to which they refer and blocks are objective-c objects, why is block1_copied deallocated before block2 goes out of scope? B) If blocks copy blocks to which they refer, and if sending -(id)copy to a heap-allocated block actually just increments its retain count, why is block1_copied deallocated before block2 goes out of scope? C) If this is the expected behavior, where is the documentation that expla
Tags (comma-separated)
Save Edits
Cancel