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

时间:2011-12-20 14:42:17

标签: objective-c objective-c-blocks automatic-ref-counting

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

@interface BlockTest : NSObject
    @property (nonatomic, weak) void(^testBlock)();
@end

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

- (void)foobar {
    self.testBlock = ^{
        [self doSomething];
    };
}

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

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

1 个答案:

答案 0 :(得分:8)

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

__weak typeof(self) weakSelf = self;
self.testBlock = ^{
    [weakSelf doSomething];
};

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