LoginSignup
0
3

More than 3 years have passed since last update.

Swift:一つのオブジェクトに対して複数の場所でdelegate渡すのは危険

Last updated at Posted at 2019-06-01

はじめに

メモリリークの勉強中,自分のアプリでミスが見つかったので備忘録.

macOSアプリだとWindowControllerを管理しないといけないのですが,NSWindow周りのイベントを扱うためにNSWindowDelegateを使います.何も考えずに必要なところで処理を行うためにWindowControllerViewControllerの両方にDelegateを継承してウィンドウのイベントを取得していたのですが,そのせいでウィンドウを閉じてもdeinitされない現象が起きていたことに気づきました.

WindowControllerサイド
import Cocoa

class WC: NSWindowController, NSWindowDelegate {

    override func windowDidLoad() {
        super.windowDidLoad()
        self.window!.delegate = self
    }

    func windowWillClose(_ notification: Notification) {
        self.contentViewController = nil
    }

}
ViewControllerサイド
import Cocoa

class VC: NSViewController, NSWindowDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear() {
        self.view.window!.delegate = self
    }

    func windowDidResize(_ notification: Notification) {
        // リサイズ時の処理
    } 

    deinit {
        Swift.print("deinit したよ") // <- 呼ばれない
    }

}

所感

職業エンジニアの方なら常識的なことかもしれませんが,独学の学生エンジニアだと動けばいい(まずは動くところまで実装するのでやっと)という感じでえいやっと実装しているのでなかなかこういう大切なことが学べていません...
C言語から入った人なので一応メモリに対する意識はごくわずかでもあるのが救いですね.

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3