在ReactiveCocoa中有宏来阻止保留周期@weakify
和@strongify。根据我的理解@weakify
执行类似我通常所做的事情,即在块中创建__weak
参考,但是@strongify
呢?
为什么我需要在街区再次强大?
以下是一些示例用法:
@weakify(self);
[RACObserve(self, username) subscribeNext:^(NSString *username) {
@strongify(self);
[self validateUsername];
}];
答案 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__
。