#ios #uitableview #childviewcontroller #didreceivememorywarning
#iOS #uitableview #childviewcontroller #didreceivememorywarning
Вопрос:
Я настроил UITableView
, в котором у каждой ячейки есть дочерний элемент UIViewController
Я пробовал повторно использовать ячейки с помощью dequeueReusableCell(with identifier:)
и добавлять / удалять дочерний контроллер представления в willDisplay cell
и didEndDisplaying cell
методах.
Еще одна вещь, которую я предпочитал использовать, — это не удаление ячеек из очереди и хранение / доступ к ним таким образом:
let cell: FeedCell
if let cached = feedCells[feedItem.uuid]{
cell = cached
}else{
cell = Bundle.main.loadNibNamed("FeedCell", owner: nil, options: nil)?.first as! FeedCell
cell.feedItem = feedItem
feedCells[feedItem.uuid] = cell
}
Итак, в основном свойство feedCells
является словарем [String: FeedCell]
, когда я повторно использовал контроллеры просмотра, это было [String: UIViewController]
Я определил, что ключом к моей проблеме является этот словарь и didReceiveMemoryWarning
Всякий раз, когда я получаю предупреждение о памяти в приложении, видимые ячейки или ViewControllers, которые являются частью этого словаря, удаляются из иерархии представлений, даже если они содержат strong
ссылку в словаре. Они сохраняются в словаре, поэтому я могу перезагрузить табличное представление и показать их снова. Что я сейчас и делаю didReceiveMemoryWarning
.
Но меня беспокоит, почему представления удаляются из иерархии подобным образом, хотя мы содержали сильную ссылку на них, и есть ли способ предотвратить это?