捕获"自我"时,弱保留块如何导致保留周期

Alf*_*nso 1 objective-c objective-c-blocks automatic-ref-counting

我有一个带有属性的类,它是对块的弱引用.

@interface BlockTest : NSObject
    @property (nonatomic, weak) void(^testBlock)();
@end
Run Code Online (Sandbox Code Playgroud)

在课程的另一点我使用这个块像这样:

- (void)foobar {
    self.testBlock = ^{
        [self doSomething];
    };
}
Run Code Online (Sandbox Code Playgroud)

编译器(Apple LLVM 3.0)抱怨可能存在保留周期,因为self这里强烈捕获.但我没有看到它如何导致保留周期,因为块本身是一个__weak参考,所以应该没问题.如果我正确理解了ARC弱引用,那么当-foobar方法返回时,传递给的块self.testBlock应该被释放(如果没有保存在其他地方),因此也会释放self.

编译器仍然认为可能存在保留周期的原因是什么?

XJo*_*nes 8

块强烈捕获其中的对象,无论块本身如何被引用.保留周期警告就是这样,警告可能性.如果根据应用程序的上下文知道此用法不会导致保留周期,则可以放心地忽略它.要摆脱警告,您可以通过中间人(强或弱)传递自我,如下所示:

__weak typeof(self) weakSelf = self;
self.testBlock = ^{
    [weakSelf doSomething];
};
Run Code Online (Sandbox Code Playgroud)

我会将您的块属性更改为强引用并执行上述操作.