@strongify 的原因是什么

What is the reason of @strongify

ReactiveCocoa中有宏来防止循环引用@weakify和@strongify。根据我的理解,@weakify 做一些我通常做的事情,即创建 __weak 引用以供在块中使用,但是 @strongify 呢?

为什么我需要在区块中再次加强它?

下面是一些示例用法:

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

如果您只是在块中使用弱引用,则 self 可以在执行块时被释放。但是如果你想确保 self 保留在内存中直到块执行完毕,你必须将弱引用转换回强引用。

@weakify(self)@strongify(self)相当于

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

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

所以,最重要的原因是你仍然可以在块中使用self而不是__weak_self__。为了避免这样的错误,将 [self doSomething]; 复制到块中,但忘记将 self 更改为 __weak_self__。它发生的不仅仅是“在执行块时自我可以被释放”。