除了弱/强舞之外还有什么方法可以在块中使用实例变量吗?

时间:2015-11-09 19:23:42

标签: objective-c objective-c-blocks instance-variables weak-references

在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,则会创建保留周期。

我知道为什么需要这样做的背景,但是在块中使用实例变量真的​​没有更简单的方法吗?您用过的任何实用方法都可以使其更短且更易读?

1 个答案:

答案 0 :(得分:2)

如果您为ivar创建property,则可以直接在weak引用上引用该属性(尽管它实际上是方法调用)。如果您想直接访问实例变量,那么您必须在发布的代码中进行weak / strong舞蹈。

我意识到这是一个Objective-C问题,但值得注意的是,这是Swift中capture lists解决的问题。