Подходит для удаления файлов или закрытия подключения к БД в dealloc? - PullRequest
2 голосов
/ 09 июня 2011

Я знаю, что dealloc вызывается, когда количество сохраняемых объектов достигает нуля, и что iVars должен быть освобожден в нем, но мне интересно, подходит ли это также подходящее место для удаления временных файлов или закрытия соединений с базой данных.

В частности, у меня есть подкласс UIViewController, который создает соединение с базой данных в -viewDidLoad, и через взаимодействие с пользователем можно создавать временные файлы.Я хотел бы закрыть соединение с БД и удалить временные файлы (если они существуют), когда вышеупомянутый контроллер извлекается из стека навигации.Должен ли я сделать это в dealloc?

Моей первой мыслью было очистить эту БД и файл в -viewDidUnload, но теперь я знаю, что этот метод вызывается только тогда, когда ОС выдает предупреждение о памяти.Другая мысль заключалась в том, чтобы поместить его в -viewDidDisappear: анимированный, но проблема с этим подходом заключается в том, что другое представление может идти поверх того, которое контролируется моим контроллером представления.В этом сценарии я не хочу закрывать соединение с БД или очищать временные файлы.

Если dealloc не является подходящим местом (это мое интуитивное чувство), где должен выполняться этот тип очистки?Я бы не хотел заставить родителя моего контроллера представления вызывать метод в ответ на то, что его дочерний элемент был удален из стека навигации.

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

В руководстве Apple по управлению памятью сказано: Нет.

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW13

Короче, не используйте dealloc для управления ресурсами.

1 голос
/ 26 августа 2011

Do not Попробуйте сделать это в методе dealloc вашего контроллера представления.

Что произойдет, если контроллер представления будет сохранен где-то, чего вы не ожидаете? Метод dealloc может не срабатывать, и вы никогда не выполняете очистку. Возможно, дело обстоит не так в коде, который вы пишете сейчас, но что-то может измениться в будущем.

Есть ли какая-то конкретная причина, по которой вы хотите связать удаление файлов и закрытие соединения с БД с отключением контроллера представления? Если нет, возможно, вы могли бы сделать это сразу после того, как ваш запрос завершен, или может иметь смысл открыть соединение с БД при запуске / переднем плане, а затем закрыть его при завершении / фоновом режиме.

Если вам нужно привязать его, чтобы увидеть, что контроллер выскочил из стека навигации, то вы можете вызвать свой метод очистки с viewDidDisappear:

1 голос
/ 09 июня 2011

Вы можете сделать это в dealloc, или, если вам нужны файлы во время жизненного цикла приложения, в делегате приложения applicationWillTerminate:. YMMV.

...