作者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)
推 aecho:請問一下,block variable哪個時候會被釋放掉? 08/31 19:38
→ aecho:countdown()裡面是共用了同一份資料吧? 08/31 19:39
→ aecho:那這塊記憶體是在stack還是heap呢? 08/31 19:39
→ aecho:每個變數都會有life scope,那block var的life scope是? 08/31 19:40