在这段代码中块的内存管理怎么样

时间:2014-09-11 10:39:58

标签: ios objective-c block

这是代码:

blk_t blk;
 {

    id array = [[NSMutableArray alloc] init];
    blk = ^(id obj) {
        [array addObject:obj];
        NSLog(@"array count = %ld", [array count]);
    };
 }
blk([[NSObject alloc] init]);
blk([[NSObject alloc] init]);
blk([[NSObject alloc] init]);

据说应用程序将被终止,因为块不会从堆栈复制到堆和自动变量'数组'已被释放和处置,但在我的测试中,它的工作没有终止。问题是什么?我对这段代码中的内存管理如何工作感兴趣,谁能解释一下呢?

1 个答案:

答案 0 :(得分:0)

这样的块文字
^(id obj) { ... }

仅在其封闭范围内有效。在将文字指定为blk后立即离开封闭范围,它将变为无效。

请勿在范围内使用它(删除{})或使用复制方法。

顺便说一句。将一个可变数组分配给id类型的变量是一种糟糕的样式,并且会在某些时候严重阻止你。