[心得] 探討Objective-C Block (part 2)

看板MacDev作者 (畢業了..@@")時間14年前 (2011/08/30 23:11), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串1/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
請問一下,block variable哪個時候會被釋放掉?
08/31 19:38, 1F

08/31 19:39, , 2F
countdown()裡面是共用了同一份資料吧?
08/31 19:39, 2F

08/31 19:39, , 3F
那這塊記憶體是在stack還是heap呢?
08/31 19:39, 3F

08/31 19:40, , 4F
每個變數都會有life scope,那block var的life scope是?
08/31 19:40, 4F
文章代碼(AID): #1ENFshUE (MacDev)
文章代碼(AID): #1ENFshUE (MacDev)