在 Swift 中,我如何在嵌套计时器中引用 `self`?
In Swift, how would I reference `self` in nested timers?
如果我要嵌套两个计时器,它们都是 class 的属性,它们在其中被引用,我是否必须在两个计时器块中调用 [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)
}
}
您可以通过收到警告这一事实来确认这一点
Expression implicitly coerced from 'Timers?' to 'Any'
两个 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)
}
}
如果我要嵌套两个计时器,它们都是 class 的属性,它们在其中被引用,我是否必须在两个计时器块中调用 [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)
}
}
您可以通过收到警告这一事实来确认这一点
Expression implicitly coerced from 'Timers?' to 'Any'
两个 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)
}
}