我有一个带有属性的类,它是对块的弱引用。
@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
。
编译器仍然认为可能存在保留周期的原因是什么?
答案 0 :(得分:8)
块强烈捕获其中的对象,无论块本身如何被引用。保留周期警告就是这样,警告可能性。如果根据应用程序的上下文知道此用法不会导致保留周期,则可以放心地忽略它。为了摆脱警告,你可以通过一个强或弱的中介来传递自我,如下所示:
__weak typeof(self) weakSelf = self;
self.testBlock = ^{
[weakSelf doSomething];
};
我会将您的块属性更改为强引用并执行上述操作。