嵌套块中的内存管理

时间:2012-08-17 06:45:48

标签: objective-c memory-management objective-c-blocks

自动保留对块内部的局部变量(包括ivars)的引用,以确保它在块的执行过程中保持有效。

那就是说,这段代码会导致self.message的过早释放,因为第一个块没有引用它,即使第二个块有效吗?或者它是否足够聪明,知道应该保留它?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    /* snip */
    dispatch_async(dispatch_get_main_queue(), ^{
        if ([self.message.ID isEqualToString:@"foobar"]) {
            /* snip */
        }
    });
});

1 个答案:

答案 0 :(得分:3)

一个块捕获其中的所有变量,包括嵌套块。简而言之:它做的是“正确”的事情。

在这种特殊情况下,请注意它是self被捕获的,而不是self.message