看板 MacDev 關於我們 聯絡資訊
: 推 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