在Objective-C中,您可能希望在块内使用实例变量,并将该块存储在对象本身中。如果你这样做,你会遇到很麻烦,以确保你不会创建循环依赖,并使所有编译器警告静音:
@implementation TestBlock {
int someVariable;
void (^someBlock)();
}
- (void) createBlock
{
// ideally I would like to use:
someBlock = ^{
someVariable++;
};
// but in reality I need to use:
TestBlock * __weak weakSelf = self;
someBlock = ^{
TestBlock *strongSelf = weakSelf;
strongSelf->someVariable++;
};
}
@end
如果使用的是weakSelf
,而不是strongSelf
,那么您将收到错误消息:
不允许取消引用__weak指针
如果直接使用self
,则会创建保留周期。
我知道为什么需要这样做的背景,但是在块中使用实例变量真的没有更简单的方法吗?您用过的任何实用方法都可以使其更短且更易读?
答案 0 :(得分:2)
如果您为ivar创建property
,则可以直接在weak
引用上引用该属性(尽管它实际上是方法调用)。如果您想直接访问实例变量,那么您必须在发布的代码中进行weak
/ strong
舞蹈。
我意识到这是一个Objective-C问题,但值得注意的是,这是Swift中capture lists解决的问题。