在Swift中,如何在嵌套计时器中引用"self"



如果我要嵌套两个定时器,这两个定时器都是引用它们的类的属性,我是否必须在两个定时器块中都调用[weak self],或者只调用第一个定时器块?

timer1 = Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { [weak self] _ in
print(self)
self?.timer2 = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { [weak self] _ in
print(self)
}
}

只要不将weak引用转换为嵌套闭包之外的强引用,weak引用就会传递到嵌套闭包中,因此不需要再次将其设为weak

所以下面的代码很好:

timer1 = Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { [weak self] _ in
print(self)
self?.timer2 = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in
print(self)
}
}

您可以通过以下事实来确认这一点:您将收到警告

从"Timers?"隐式强制的表达式到"任意">

在两个print语句上。

你总是需要在引用self的最外层闭包中创建一个弱引用,否则你的外层闭包会创建一个强引用循环,所以内层闭包是否创建弱引用不会有什么区别。

这会创建一个强引用循环,因为要访问timer2,需要使用对self的强引用。

timer1 = Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { _ in
print(self)
self.timer2 = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { [weak self] _ in
print(self)
}
}

只要使用不同名称的变量将弱引用转换为强引用,则对self的引用将为weak,因此不需要再次将其设为weak

因此,下面的代码也没有强参考循环。

timer1 = Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { [weak self] _ in
guard let strongSelf = self else { return }
print(strongSelf)
strongSelf.timer2 = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in
guard let self = self else { return }
print(self)
}
}

相关内容

  • 没有找到相关文章

最新更新