分析,以下實在ARC的環(huán)境下的說明:
blk blk_t;
{
id array = [[NSMutableArray alloc] init];
blk_t = ^(id obj) {
[array addObject:obj];
};
}
blk_t([[NSObject alloc] init]);
變量作用域結(jié)束的同時,變量array被廢棄,其強引用失效,因此NSMutableArray類對象被廢棄。
當執(zhí)行 blk_t([[NSObject alloc] init]);程序肯定會報錯。
怎么延長array變量的作用域
調(diào)用copy函數(shù)。
因為此block現(xiàn)在棧上,調(diào)用copy函數(shù)之后,將block復制到堆上。被截獲的對象現(xiàn)在被堆上的block所持有。因此就延長了截獲對象的作用域。
blk blk_t;
{
id array = [[NSMutableArray alloc] init];
blk_t = [^(id obj) {
[array addObject:obj];
}copy];
}
blk_t([[NSObject alloc] init]);
總結(jié)如下:在ARC模式下,用strong修飾的對象,被block捕獲后,會被block所持有。這個在以后的循環(huán)引用中會用到。