[心得] 探討Objective-C Block (part 2)
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)
推
08/31 19:38, , 1F
08/31 19:38, 1F
→
08/31 19:39, , 2F
08/31 19:39, 2F
→
08/31 19:39, , 3F
08/31 19:39, 3F
→
08/31 19:40, , 4F
08/31 19:40, 4F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章