didReceiveMemoryWarning удаляет ячейки / представления из иерархии UITableView

#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 .

Но меня беспокоит, почему представления удаляются из иерархии подобным образом, хотя мы содержали сильную ссылку на них, и есть ли способ предотвратить это?