作者popcorny (毕业了..@@")
看板MacDev
标题[心得] 探讨Objective-C Block (part 2)
时间Tue Aug 30 23:11:36 2011
Blog版
http://popcornylu.blogspot.com/2011/08/objective-c-block-part-2.html
这篇我们来先探讨block variable,也就是
__block这个修饰字。
前一篇有提到,block在别的语言叫做closure,
这个closure的概念很像是把环境闭锁起来,
而这个环境就是指定义该block的这个call stack frame。
当block被呼叫
block_copy的时候,或是
[someBlock copy]的时候
这个block就会进入heap,
并且会指到目前的stack frame形成closure。
而block variable会跟这个closure绑住,
所以可能说closure variable会更加的贴切。
我们来看下面一个有趣的例子
typedef NSUInteger (^countdown_type)(void);
countdown_type createCountdown(NSUInteger number)
{
__block NSUInteger counter = number;
return [[^NSUInteger{
return counter--;
} copy] autorelease];
}
这个function产生了一个block,这个block中有一个block variable,
起始值是由传进来的参数决定。
之後每呼叫一次counter都会减1,并且把原本的值传回去。
下面使用的范例
countdown = createCountdown(10);
NSLog(@"%d", countdown()); //10
NSLog(@"%d", countdown()); //9
NSLog(@"%d", countdown()); //8
所以我们更能清楚知道local variable跟block variable的差异。
local variable随着function回传而该变数的位置就随着call stack pop掉。
而如果local static variable跟block variable的比较
static local整个app只有一份。
但是block variable是一个closure一份,
所以以这个例子,如果我们用的是local static,则所有的countdown都共用一个counter。
而如果是用block variable,则每个block都各自有自己的一份。
如果你比较了解了block variable的定义,
你可以在回头想想为什麽在block中local variable只能当常数使用,
而block variable可以当变数使用。
相信你心中已经有答案了 :D
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.239.120
※ 编辑: popcorny 来自: 114.32.239.120 (08/30 23:11)
1F:推 aecho:请问一下,block variable哪个时候会被释放掉? 08/31 19:38
2F:→ aecho:countdown()里面是共用了同一份资料吧? 08/31 19:39
3F:→ aecho:那这块记忆体是在stack还是heap呢? 08/31 19:39
4F:→ aecho:每个变数都会有life scope,那block var的life scope是? 08/31 19:40