@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__
。它发生的不仅仅是“在执行块时自我可以被释放”。
在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__
。它发生的不仅仅是“在执行块时自我可以被释放”。