__weak MyClass *selfReference = self;

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

    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)在块内创建的变量属于该块,并且在该块超出范围时将被释放。

    09-26 06:51