探讨Objective-C Block (2)
我们来先探讨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
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
