ViewControllerが解放されない。クロージャーで強参照していた件。

使い終わったViewControllerでdeinitが呼ばれていないことに気づいた。

メンテナンス性を上げようとしてカプセル化を行ったは良いが、クロージャーで強参照をしてしまっていた。

delegateや、rootViewcontrollerのようなパラメータにweakの指定はもちろんのこと、クロージャ内でも注意しないといけない。

Hoge.swift

class Hoge: NSObject {
    
    weak var rootViewController:UIViewController?
    var onSuccess:((Int) -> ())?

....
}

onSuccessにもweakをつけたいのだが、そうもいかないらしい。

ViewController.swift

hoge.onSuccess = { [weak self] (value:Int) -> Void in
      self?.somethingDo(value)
}

このように、呼び出す側で [weak self]というのをつけてやることで弱参照となりViewControllerでdeinitが呼ばれるようになった。