作者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
1F:推 aecho:嗯嗯,就不知道obj-c在转成c的时候,是怎麽处理掉了… 09/01 23:50
2F:→ aecho:不过看来block在还没释放之前,他所参考到的东西都还是在的 09/01 23:50
3F:→ aecho:之前看到的讨论是说,block有着NSObject的特性 09/01 23:51
4F:→ aecho:可以copy/release or autorelease,所以我认为block这东西 09/01 23:52
5F:→ aecho:应该和一般的物件一样一开始就存在heap里。 09/01 23:53
6F:→ aecho:所以对於下了copy後,从stack转到heap这一段有疑惑就是了… 09/01 23:54
7F:→ aecho:至於retain cycle,如果没有对block做copy的动作的话… 09/01 23:55
8F:→ aecho:应该是不会发生吧…!? 09/01 23:55
9F:→ popcorny:c的时候有block_copy/block_release可以用啊. 09/02 08:27
10F:→ popcorny:一开始没有放在heap.. 是在copy才会到heap... 09/02 08:29
11F:→ popcorny:而[block copy]是compiler会编译成call到block_copy 09/02 08:30