6
__weak MyClass *selfReference = self;

dispatch_async(dispatch_get_main_queue(), ^{
        [selfReference performSomeAction];
    });
  • 什么时候需要传递对块的弱引用?
  • 此规则是否适用于 dispatch_async 以及自定义块?
  • 块是复制其中使用的 iVar 还是保留它们?
  • 谁拥有在块内初始化的变量?谁应该释放他们?
4

1 回答 1

13

1, 2) 块在其中保留对象指针(任何块,dispatch_async 块都没什么特别的)。这通常不是问题,但可能导致保留周期,因为块可以与所有者对象相关联,并且该所有者对象(通常self)可能被块保留。在这种情况下,您应该使用弱变量,然后将其重新分配给强捕获:

__weak MyClass *weakSelf = self;
self.block = ^{
    MyClass *strongSelf = weakSelf;
    ...
    [strongSelf ...];
    [strongSelf.property ...];
    [strongSelf->iVar ...];
 }

注意:如果您直接访问 iVar,编译器会将其转换为 self->iVar 并因此保留 self!

3)块只保留指针,它们不复制它们。

4) 在块内创建的变量属于该块,当该块超出范围时将被释放。

于 2012-08-31T16:13:00.207 回答