2

xcode(6.3.2)で新しい「Single View Application」プロジェクトを作成し、ViewControllerにdeinit関数のみを追加するとします。アプリを実行し、アプリを閉じます。Deinit が呼び出されることはありません。いくつかのデバイスとシミュレーターでテストしました。

deinit {
    println("deinit:")
}

何故ですか?それは標準的な動作ですか?機能させるにはどうすればよいですか?

/* 編集 */ コメントを読んだ後、このコードを Viewcontroller に追加しました。

import UIKit

class A {
    func test() {
        println("A test")
    }

    deinit {
        println("A deinit")
    }
}

class ViewController: UIViewController {

    var a:A? = A()

    override func viewDidLoad() {
        super.viewDidLoad()
        println("ViewController viewDidLoad")
        a?.test()
    }

    override func viewDidDisappear(animated:Bool) {
        println("ViewController viewDidDisappear")
        a = nil
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        println("ViewController didReceiveMemoryWarning")
    }

    deinit {
        println("ViewController deinit")
        a = nil
    }
}

今私は得る

ViewController viewDidLoad:
A test
ViewController viewDidDisappear:
A deinit

これは、ビュー コントローラーの deinit 関数が信頼できないため、viewDidDisappear 呼び出し内で手動でオブジェクトをクリーンアップする必要があるということですか?

4

2 に答える 2

1

Appleがドキュメントで述べているように、アプリの終了はSIGKILLを介して行われ、メッセージを送信して終了するよりもはるかに高速です。

したがって、コードは呼び出されません。たとえば、applicationWillTerminate も呼び出されません。

このコードを試してください:

//  CustomView.swift
import UIKit

class CustomView: UIView {

    deinit{
        print("Swift CustomView dying...\n")

    }
}

コントローラーで:

var v : CustomView?
        v = CustomView(frame: CGRectZero)

        v = nil

コンソールで次のことを行います。

Swift CustomView が死んでいます...

ご要望に応じて、サンプル プロジェクトをご利用いただけます。(私に書いて)

于 2015-08-08T09:21:20.640 に答える