Я использую dispatch_once NSObject для создания указателей данных. Таким образом, все указатели на игровые активы создаются при появлении основного контроллера представления. Чтобы начать игру, пользователь нажимает кнопку UIButton, соответствующую определенному уровню в UIViewController. Позвольте мне назвать его LevelSelectionController. Когда игра закончится, пользователь коснется ярлыка (SKLabel). И все действия и узлы будут удалены.
[self removeAllActions];
[self removeAllChildren];
[self removeFromParent];
Более того, подкласс SKScene для определенного уровня делегирует задачу возврата пользователя в LevelSelectionController контроллеру представления, представляющему игру SKView, следующим образом.
- (void)closeScene {
SKView *spriteView = [[SKView alloc] init];
[spriteView presentScene:nil];
[self.navigationController popViewControllerAnimated:YES];
}
Единственная проблема, которая у меня есть, заключается в том, что память остается высокой, когда пользователь покидает игровую сцену (SKScene). Игра требует много ресурсов. Поэтому, когда игра запускается, использование памяти подскакивает до 200 МБ. Когда пользователь возвращается к исходному контроллеру представления выбора уровня, симулятор игры по-прежнему потребляет 200 МБ, согласно монитору активности. Когда пользователь переходит на другой уровень, использование памяти увеличивается еще на 10 МБ. Итак, как я могу освободить память для последней игры, когда пользователь покидает SKScene?
Я использую АРК. Версия Xcode 5.1. Целью разработки является iOS 7.1.
Спасибо за помощь.
-- Редактировать 1 --
Я глупый. Я знаю, в чем проблема. Когда я закрываю сцену, я создаю новый SKView, который затем устанавливаю на ноль, чтобы выйти из текущей сцены. Оно работает. Но это не должно быть способом сделать это. Вместо этого мне нужно установить текущий SKView в переменную перед его представлением. Когда я закрываю сцену, мне нужно установить эту переменную в ноль. Хм... Я не думал.
-- Редактировать 2 -- Там мало изменений, когда текущая сцена представлена с нулевым значением. Удаление его из removeFromSuperview мало что дает.