斯威夫特 - 保留周期而不是自我?

时间:2017-11-27 11:16:47

标签: ios swift retain-cycle

问题很简单。 我知道要检测保留周期,但我想知道在下一个例子中我是否保留周期。

    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?()
}

1 个答案:

答案 0 :(得分:1)

答案是“它取决于”。

如果MainManager强烈引用soundsound强烈引用player,则player.speak()使player保持强势引用它无法摆脱的闭包,那么是的,你有一个强大的参考周期。

但是,如果speak只是将闭包放在一个异步队列中并且再也没有引用它,那么你就可以了。