2012-08-17 54 views
1

对块内部的局部变量(包括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 */ 
     } 
    }); 
}); 
+0

我相信第一个块引用它,但不是明确的 - 它在外部范围内访问 - 这只是另一个细节,它也在第二个内部范围内。 – 2012-08-17 06:48:15

+1

它与嵌套块一起工作,但保留'self',而不是'self.message'。 – 2012-08-17 07:05:53

回答

3

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

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