Objective-C - 块和内存管理?

ary*_*axt 6 memory-management objective-c objective-c-blocks

__weak MyClass *selfReference = self;

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

Fab*_*ser 12

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

__weak MyClass *weakSelf = self;
self.block = ^{
    MyClass *strongSelf = weakSelf;
    ...
    [strongSelf ...];
    [strongSelf.property ...];
    [strongSelf->iVar ...];
 }
Run Code Online (Sandbox Code Playgroud)

注意:如果直接访问iVar,编译器会将其转换为self-> iVar,从而保留自己!

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

4)块内创建的变量属于该块,并在该块超出范围时释放.