6

ReactiveCocoa中有宏来防止保留循环@weakify和@strongify。根据我的理解@weakify,做一些我通常做的事情,就是__weak为在块中使用创建参考,但是呢@strongify

为什么我需要让它在街区再次变强?

这是一些示例用法:

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

2 回答 2

9

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

于 2015-03-02T12:01:47.980 回答
-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)

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

于 2020-08-11T13:14:46.010 回答