【问题标题】:memory management in nested blocks嵌套块中的内存管理
【发布时间】:2012-08-17 06:45:48
【问题描述】:

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

【问题讨论】:

  • 我相信第一个块确实引用了它,但没有明确地引用它——它是在外部范围内访问的——这只是另一个细节,它也在第二个内部范围内。
  • 它适用于嵌套块,但保留self,而不是self.message

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2016-10-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多