strongSelf 指向块中的 weakSelf,为什么?
strongSelf pointing to weakSelf in a block, why?
我正在尝试理解这段代码:
__weak LoginViewController *weakSelf = self;
NSTimer *networkTimer = [NSTimer pym_scheduledTimerWithTimeInterval:15.0 block:^{
LoginViewController *strongSelf = weakSelf;
[strongSelf timeout];
} repeats:NO];
[PYMAuthManager loginWithUsername:username password:password completionHandler:^(BOOL successful) {
if (successful) {
[networkTimer invalidate].......
这是一个网络定时器,如果没有 activity,它将在 15 秒后超时。为什么要在块中创建指针*strongSelf = weakSelf?直接用[weakSelf timeout]不行吗?我知道每当在块中访问 self 时我们都必须使用弱引用,为什么要在这里创建另一个指针?任何帮助都会很棒,谢谢。
编辑:已更新以更好地反映实际系统语义(正如 Darren 所指出的)。
通过在代码块中使用 weakSelf
,您可以避免循环保留。如果将块代码替换为[weakSelf timeout]
,则没有区别;该对象在 timeout
执行期间保留。
如果您改为使用 __unsafe_unretained
创建 weakSelf
,则机器可能会将内存释放回系统并导致您的应用程序 EXC_BAD_ACCESS
在执行 timeout
。在此实例中创建强引用可避免此错误。
当你创建一个强引用时,它就在它的范围内;在这种情况下,在块的持续时间内。因为您的块仅有效地执行一条语句,所以 [weakSelf timeout]
的替换不会造成任何伤害。如果您有多个语句全部使用 weakSelf
或依赖于 weakSelf
的状态,那么您可能希望为所有语句的范围创建一个强引用。