Утечка памяти с помощью SpriteKit в ячейках представления коллекции

Я использую SpriteKit для анимации в UICollectionViewCell в UICollectionView. В сцене есть один спрайт, который я анимирую с помощью SKAction. ContentView каждой ячейки имеет свой собственный SKView/SKScene. Я столкнулся с утечкой памяти. Когда я смотрю на это в Инструменте распределения в Xcode 6.3, я вижу, что с каждой новой ячейкой есть пара выделений > 1 МБ, одно из которых связано с «SKView set_context», а другое — с атрибутом allocateWCMemory GLEngine».

Внутри каждого UICollectionViewCell это довольно стандартные вещи. Я создаю другие (не связанные с анимацией) подвиды UIView и добавляю их в contentView.

Одна вещь, которая является странной и, возможно, связанной, заключается в том, что я не получаю последовательно вызываемый метод deinit UICollectionViewCell.

Мысли?

Обновления:

1) Кажется, это напрямую связано с анимацией, а не столько с представлениями коллекции. Если я просто отключу анимационную часть кода, похоже, у меня не будет утечки памяти. Или, по крайней мере, не так много памяти утекает. В этом случае SKScene/SKView по-прежнему выделяются (для каждой ячейки представления коллекции), но я просто не анимирую спрайт. Я также должен добавить, что в этом случае, с отключенной анимацией, я получаю все мои точки останова освобождения там, где они должны быть достигнуты (например, метод deinit UICollectionViewCell).

2) Теперь я снова добавил анимацию, но я просто делаю один цикл. Я делал повторяющиеся анимации (одна и та же анимация, только что повторенная, управляемая таймером). Когда я делаю это только один раз и останавливаюсь, утечки памяти нет. Итак, проблема, похоже, связана с моими повторяющимися анимациями.


person Chris Prince    schedule 24.06.2015    source источник
comment
Итак, каждая ячейка имеет SKView/SkScene? Sprite Kit действительно не поддерживает несколько экземпляров сцен. Должен быть лучший способ реализовать то, что вы пытаетесь сделать.   -  person Epic Byte    schedule 24.06.2015
comment
Спасибо @Epic Byte. Можете ли вы показать мне документ Apple, в котором указано, что несколько экземпляров сцены не поддерживаются?   -  person Chris Prince    schedule 24.06.2015
comment
@EpicByte, так что, если бы я захотел использовать SpriteKit и UICollectionView, например, для игры в крестики-нолики, это было бы невозможно? Я хочу иметь один спрайт в моем UICollectionViewCell   -  person Boris Y.    schedule 21.09.2015
comment
Это то, что у меня есть. Один SKSpriteNode в SKView (ну, в SKScene) на ячейку.   -  person Chris Prince    schedule 05.11.2015


Ответы (2)


Не глядя на код, трудно сказать, но есть одна вещь, на которую стоит обратить внимание: содержит ли какой-либо из ваших SKActions блок, ссылающийся на self? Если это так, это может вызвать цикл удержания. В этом случае вам нужно будет получить ссылку weak на self (она будет отличаться между Swift и Objective C, но она понадобится им обоим). Хорошее объяснение (и достойные примеры Swift) можно найти в этот пост.

person Good Doug    schedule 24.06.2015
comment
У меня не было SKActions, которые ссылались на себя. - person Chris Prince; 25.06.2015

Эта утечка памяти, по-видимому, не имеет ничего общего со SpriteKit или представлениями коллекции. Я представлял UICollectionView в контроллере модального представления, и у этого модального (Objective C) была проблема, которая, похоже, возникла только при соединении его со Swift. Содержащий контроллер модального представления не освобождался. Таким образом, содержащиеся в нем объекты (такие как UICollectionView и внутри него SKView/SKScene) не освобождались.

Этот модал представляет собой UINavigationController. Используя этот класс Objective-C, связанный со Swift, я считаю необходимым добавить в строку:

// popupNavController is the UINavigationController used to present the modal view controller
self.popupNavController.viewControllers = nil;

когда я отклоняю модальный.

person Chris Prince    schedule 25.06.2015