UICollectionViewCell не освобождает память UIImageView

uicollectionviewcell

#1

Я использую API (не открытый) для подгрузки скриншотов. Я создал меню в котором перечислил функционал в TableView. Например:
-Главная
-Настройки
-Картинки
-Названия

Когда я выбираю картинку, я инициализирую новый UICollectionViewController следующим методом

self.performSegue(withIdentifier: “segueID”, sender: nil)

При прокручивании ленты CollectionView все хорошо память не увеличивается. Скачивание происходит в UICollectionViewCell и выглядит так:

URLSession.shared.dataTask(with: url) { (data, response, error) in{ … self.imageVIew.image = UIimage(data: validData) …}
(Я опустил все проверки guard для сокращения)

Как только я возвращаюсь к моей таблице TableView память не освобождается от этих картинок. И если спамить (раздел Картинки), и каждый раз заходить и выходить из UICollectionViewController, память наращивается на 10 -15 мб. И так может дойти до вылета. Так как правильно освободить память? Или в чем может быть проблема?


#2

как насчет использования библиотек для работы с картинками?


#3

Сама лента картинок уже реализована. И не хотелось бы вмешивать сюда лишние библиотеки.


#4

Дело ваше. Проверьте, после ухода назад у вас лента картинок (ViewController) уничтожается?


#5

Да, я заметил, что когда я выхожу из UICollectionViewController, deinit{ } не вызывается.

Возможно это связана с переходами (но это не точно). Мой переход выглядит следующе:
TableViewController1 (вызываем для перехода performSegue()) -> TableViewController2 (вызываем для перехода performSegue())-> CollectionVIewController
Когда я совершаю переход из 2 таблицы в 1, то deinit{} во 2-й таблице вызывается
Даже если это так, как эту проблему исправить?
На ум приходит только создать сильную ссылку во 2-й таблице, и каждый раз когда вызываешь CollectionViewController проверять ее на nil, после чего вызывать ее self.present(viewController: )


#6

Я нашел в чем проблема. И почему у меня не освобождался CollectionViewController. Дело в том, что я в CollectionViewCell пердавал ссылку на объект CollectionViewController.

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! EventCellCollectionViewCell
    //cell.postEventController = self - тут я передавал ссылку на CollectionViewController
    cell.socket = self.socket
    cell.postModel = self.postsEvent[indexPath.item]
    return cell
}

В интернете нашел похожую проблему. Но решение было другое, путем удаления из CollectionViewCell присвоенных делегатов


#7

Это хорошо, что вы самостоятельно разобрались с проблемой, но советую изучить эту очень классную статью на будущее и не только вам:


#8

достаточно было просто сделать ее слабой ссылкой (weak), это вроде как в основах рассказывается при работе с таблицами.


#9

Да, вы правы. Из головы вылетело про это. Думал проблема в картинках