问题很简单。 我知道要检测保留周期,但我想知道在下一个例子中我是否保留周期。
MainManager.sound.player.speak("1", didFinish: {
MainManager.sound.player.speak("3", didFinish: {
MainManager.sound.player.speak("4", didFinish: {
})
})
})
MainManager
是一个单例类,可以将sound
保留在强参考中,并将sound
保持player
类保留在强参考中。
speak()的实现
private var speechSynthesizer:AVSpeechSynthesizer?
private var speechDidFinishCompletion:CompletionVoid? = nil
func speak(_ stringToSpeak:String, didFinish:CompletionVoid? = nil)
{
if speechSynthesizer == nil
{
speechSynthesizer = AVSpeechSynthesizer()
speechSynthesizer?.delegate = self
}
speechDidFinishCompletion = didFinish
let speechUtterance = AVSpeechUtterance(string: stringToSpeak)
speechSynthesizer!.speak(speechUtterance)
}
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance)
{
speechDidFinishCompletion?()
}
答案 0 :(得分:1)
答案是“它取决于”。
如果MainManager
强烈引用sound
而sound
强烈引用player
,则player.speak()
使player
保持强势引用它无法摆脱的闭包,那么是的,你有一个强大的参考周期。
但是,如果speak
只是将闭包放在一个异步队列中并且再也没有引用它,那么你就可以了。