作者popcorny (畢業了..@@")
看板MacDev
標題Re: [心得] 探討Objective-C Block (part 2)
時間Wed Aug 31 23:11:42 2011
: 推 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
我沒有找到明確的資料
不過block variable以他的特性不太可能放在stack..
因為他不會因為function return而就不能使用
所以應該只能放在heap
而至於他的生命週期
我覺得block variable的生命週期應該是跟著closure. 而不是block
因為多個block可能reference到同一個closure
例如
- (void)createCountdown:(int)initValue{
__block int counter = intValue;
self.countdown1 = [[^int{
return counter--;
} copy] autorelease];
self.countdown2 = [[^int{
int temp = counter;
count -= 2;
return temp;
} copy] autorelease];
}
上面的例子兩個block都用到counter這個block varialbe
而這兩個block都會在被產生的時候reference到上面createCountdown這邊的closure
所以要等到countdown1跟countdown2這兩個block都release時
closure才會release
而這個block variable才會結束生命週期..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.239.119
推 aecho:嗯嗯,就不知道obj-c在轉成c的時候,是怎麼處理掉了… 09/01 23:50
→ aecho:不過看來block在還沒釋放之前,他所參考到的東西都還是在的 09/01 23:50
→ aecho:之前看到的討論是說,block有著NSObject的特性 09/01 23:51
→ aecho:可以copy/release or autorelease,所以我認為block這東西 09/01 23:52
→ aecho:應該和一般的物件一樣一開始就存在heap裡。 09/01 23:53
→ aecho:所以對於下了copy後,從stack轉到heap這一段有疑惑就是了… 09/01 23:54
→ aecho:至於retain cycle,如果沒有對block做copy的動作的話… 09/01 23:55
→ aecho:應該是不會發生吧…!? 09/01 23:55
→ popcorny:c的時候有block_copy/block_release可以用啊. 09/02 08:27
→ popcorny:一開始沒有放在heap.. 是在copy才會到heap... 09/02 08:29
→ popcorny:而[block copy]是compiler會編譯成call到block_copy 09/02 08:30