@strongify是什么原因

时间:2015-03-02 11:53:49

标签: ios reactive-cocoa retain-cycle

ReactiveCocoa中有宏来阻止保留周期@weakify和@strongify。根据我的理解@weakify执行类似我通常所做的事情,即在块中创建__weak参考,但是@strongify呢?

为什么我需要在街区再次强大?

以下是一些示例用法:

@weakify(self);
[RACObserve(self, username) subscribeNext:^(NSString *username) {
    @strongify(self);
    [self validateUsername];
}];

2 个答案:

答案 0 :(得分:5)

如果您只是在块中使用弱引用,则在执行块时可以取消分配self。但是如果你想确保自我保持在内存中直到块完成执行,你必须将弱引用转换回强。

答案 1 :(得分:-1)

@weakify(self)@strongify(self)等同于

__weak typeof(self) __weak_self__ = self; // weakify
[self setBlock:^{
    __strong typeof(__weak_self__) self = __weak_self__; // strongify
    [self doSomething];
}];

如果该块中没有__weak_self__,则必须使用@strongify(self)

因此,最重要的原因是,您仍然可以在块中使用self而不是__weak_self__。为避免此类错误,请将[self doSomething];复制到块中,但忘记将self更改为__weak_self__