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

看板MacDev作者 (畢業了..@@")時間14年前 (2011/08/31 23:11), 編輯推噓1(1010)
留言11則, 2人參與, 最新討論串2/2 (看更多)
: 推 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

09/01 23:50, , 1F
嗯嗯,就不知道obj-c在轉成c的時候,是怎麼處理掉了…
09/01 23:50, 1F

09/01 23:50, , 2F
不過看來block在還沒釋放之前,他所參考到的東西都還是在的
09/01 23:50, 2F

09/01 23:51, , 3F
之前看到的討論是說,block有著NSObject的特性
09/01 23:51, 3F

09/01 23:52, , 4F
可以copy/release or autorelease,所以我認為block這東西
09/01 23:52, 4F

09/01 23:53, , 5F
應該和一般的物件一樣一開始就存在heap裡。
09/01 23:53, 5F

09/01 23:54, , 6F
所以對於下了copy後,從stack轉到heap這一段有疑惑就是了…
09/01 23:54, 6F

09/01 23:55, , 7F
至於retain cycle,如果沒有對block做copy的動作的話…
09/01 23:55, 7F

09/01 23:55, , 8F
應該是不會發生吧…!?
09/01 23:55, 8F

09/02 08:27, , 9F
c的時候有block_copy/block_release可以用啊.
09/02 08:27, 9F

09/02 08:29, , 10F
一開始沒有放在heap.. 是在copy才會到heap...
09/02 08:29, 10F

09/02 08:30, , 11F
而[block copy]是compiler會編譯成call到block_copy
09/02 08:30, 11F
文章代碼(AID): #1ENayn9h (MacDev)
討論串 (同標題文章)
文章代碼(AID): #1ENayn9h (MacDev)