Подходит для удаления файлов или закрытия соединения с БД при освобождении?

#objective-c #ios #uiviewcontroller #dealloc

#objective-c #iOS #uiviewcontroller #освободить

Вопрос:

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

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

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

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

Ответ №1:

В руководстве Apple по управлению памятью говорится, что нет.

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

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

Комментарии:

1. спасибо за ссылку; это было очень информативно. Мне нужно найти другой способ выполнить то, что я хочу

Ответ №2:

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

Комментарии:

1. Спасибо за ответ. Нет, я определенно хочу, чтобы файлы исчезли, а соединение с БД закрылось, когда контроллер просмотра будет удален из стека навигации. Вы знаете, считается ли плохой практикой очищать этот материал в dealloc? Во всех примерах, которые я видел, выпускаются только iVars…

2. Я не думаю, что это плохая практика. Тем не менее, я бы рекомендовал создать некоторый тип кода «очистки» и вызвать его первым в вашей реализации dealloc. Это даст вам немного больше гибкости в будущем.

Ответ №3:

Не пытайтесь сделать это dealloc методом вашего контроллера представления.

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

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

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

Комментарии:

1. В моем приложении есть в основном одно «представление», где необходимо подключение к БД и часто выполняются запросы. По этой причине я хотел бы сохранить соединение с БД открытым в течение всего срока действия представления, а затем закрыть его, когда пользователь вернется на уровень выше.