MyBlock getBlocks()
{
MyBlock myBlock = ^{
NSLog(@"Hello World!");
};
return myBlock;
}
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
MyBlock myBlock = getBlocks();
myBlock();
[pool drain];
return 0;
}
爲什麼此代碼段工作? myBlock應該被銷燬。Objective-C中塊的生命週期
順便說一句,這個片段也可以工作:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"%ld", [obj retainCount]);
MyBlock myBlock = ^{
NSLog(@"Hello World!");
NSLog(@"%ld", [obj retainCount]);
};
[obj release];
但[OBJ retainCount]在版畫1而不是2,爲什麼呢?
+1,我同意分析。第一個片段是巧合工作,不應該依賴。關於'retainCount','NSMallocBlock永遠不會實際複製鏈接文章的段落「解釋了原因:它不會因爲實現而增加。另外值得一提的是:http://whentouseretaincount.com/ P –
這並不是說該塊在堆棧中,它也可能是全局的。 –
第一個例子中的塊肯定是全局的。 – Sulthan