如果我要嵌套两个定时器,这两个定时器都是引用它们的类的属性,我是否必须在两个定时器块中都调用[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)
}
}