在 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)
    }
}