2015-06-29 3 views
2

Если я создаю новый проект «Single View Application» с xcode (6.3.2) и добавлю только функцию deinit в ViewController. Запустить приложение, закрыть приложение. Деинит никогда не называется! Я тестировал его с помощью нескольких устройств и симулятора.deinit in empty swift Project не называется

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 

Означает ли это, что я должен очистки мои объекты вручную внутри вызова viewDidDisappear, поскольку контролеры вид Deinit функция не является надежным?

+2

Есть ли момент, когда этот ViewController выходит из памяти? Вы заменяете этот viewController другим? –

+0

Нет. Все, что я сделал, это добавить deinit. Ничего больше. Вы можете протестировать его, создав новый проект «Single View Application». Затем добавьте deinit с println и/или точкой останова. –

+3

Возможный дубликат [Swift: нет вывода для println в методе deinit (без использования игровой площадки)] (http://stackoverflow.com/questions/27044573/swift-no-output-for-println-in-deinit-method-not -using-playground) –

ответ

1

Нет. В этом случае ViewController deinit даже не вызывается, потому что ViewController не выходит из памяти.

Способ проверки этого заключается в создании нового ViewController и замене на него текущего ViewController. Это должно удалить ваш текущий ViewController из памяти, следовательно, он вызывает метод deinit.

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 умирающего ...

Образец проекта доступен по запросу. (напишите мне)

+0

Интересно, что произойдет с моей памятью, если я выделил кусок памяти через 'UnsafeMutablePointer' и не буду использовать дополнительный тип для моего класса (который содержит указатель) и приложение заканчивается ?! Я получаю утечку памяти, если да, то как это решить, потому что 'deinit' никогда не вызывается, когда приложение (командной строки) заканчивается без каких-либо ошибок. – DevAndArtist

Смежные вопросы