Он кажется, что эквивалент Swift dealloc
- deinit
. Однако, когда вы пытаетесь определить метод на UIViewController, он не ведет себя так, как вы ожидали бы...
Настройка
- Создайте новый проект Single View с помощью Xcode 7.0 в Swift или Objective-C.
- Добавьте кнопку "увольнение" на контроллере представления, который был создан с помощью раскадровки (я буду ссылаться на этот контроллер представления как VC2, его класс - ViewController).
- Добавить новый контроллер представления и установить его как начальный контроллер представления (VC1, класс - nil).
- Добавьте кнопку "настоящее" в VC1 с "текущим моментом" до VC2.
- В коде VC2 поместите точку останова в
deinit
(Swift) илиdealloc
(Objective-C). -
В VC2 сделайте действие кнопки "увольнение" следующим образом:
// Swift: presentingViewController?.dismissViewControllerAnimated(true, completion: nil) // Objective-C: [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
- Запустите приложение и нажмите обе кнопки, чтобы сначала представить VC2, а затем отпустите его.
Обратите внимание, что в Objective-C, точка останова dealloc
нажата.
В Swift, с другой стороны, точка останова deinit
никогда не попадает.
Почему deinit
никогда не вызывается? Является ли это ошибкой или по дизайну?
Если это по дизайну, где я должен поместить очищающий код, чтобы освободить ресурсы, когда контроллер просмотра больше не понадобится? (Он не может быть в viewDidUnload
, поскольку этот метод устарел. Он не может быть в viewDidDisappear
, потому что что-то еще может содержать ссылку на него и в конечном итоге отобразит его снова.)
Примечание. Если вы попытаетесь определить метод dealloc
в Swift, вы получите следующую ошибку:
Метод 'dealloc()' с Objective-C selector 'dealloc' конфликтует с деинициализатором с тем же селектором Objective-C.
Если у вас есть контроллер представления Swift наследуется от контроллера Objective-C, и вы помещаете точку останова в метод dealloc Objective-C, вы получите такое же неправильное поведение, как указано выше: deinit
не будет вызываться, но будет вызван dealloc
.
Если вы пытаетесь использовать Allocations для просмотра количества экземпляров класса в памяти, обе версии показывают одно и то же: # Persistent
всегда 1, а # Transient
увеличивается каждый раз, когда вы показываете второй контроллер представления.
Учитывая выше настройки, не должно быть никаких сильный опорный цикл держась контроллера представления.