Я установил 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
Всякий раз, когда я получаю предупреждение о памяти в приложении, видимые ячейки или контроллеры ViewController, являющиеся частью этого словаря, удаляются из иерархии представления, даже если они содержат ссылку strong
в словаре. Они продолжают жить в словаре, поэтому я могу перезагрузить табличное представление и показать их снова. Что я сейчас и делаю на didReceiveMemoryWarning
.
Но меня беспокоит, почему представления удаляются из иерархии таким образом, даже если мы твердо на них ссылаемся, и каким-либо образом можно это предотвратить?