Проблема управления памятью (выпуск UIVIewCotroller) - PullRequest
0 голосов
/ 02 апреля 2011

Разрабатываю игру для iPad (сочиняю картинки из пазлов). В моем меню я выбираю уровень сложный (простой, средний или жесткий). После выбора будет показано основное игровое поле. Вот место, где я создаю основное игровое поле:

- (void)simpleDiffButtonClicked:(id)sender
{
    UIButton *button = sender;
    if (simpleDiffButton == button) {
        UIView *mySuperView = self.view.superview;

        mainGame = [[MainGame alloc] initWithMode:1 andImage:nil]; //mainGame variable is declared in header file like: MainGame *mainGame;
        mainGame.view.frame = CGRectMake(0, 0, 1024, 768);
        [mySuperView addSubview: mainGame.view];
}

}

После того, как появится это игровое поле (есть много подслоев, добавляющих в self.view.layer), и я могу взаимодействовать с ним. Когда я хочу выйти из него, я нажимаю кнопку «назад». (здесь я хочу выпустить мой viewcontroller)

- (void)backToMenuButtonClicked:(id)sender
{
    UIButton *button = sender;
    if (nextImageClick == YES) {
        return;
    }   
    if (backToMenuButton == button) {
     self.view.layer.sublayers = nil;  //here's an exception
    [self.view removeFromSuperview];

    }
}

После нажатия кнопки «назад» все в порядке. И я могу выбрать трудно уровень снова. A выберите уровень, и после этого снова нажимаете кнопку «назад» и в этом месте происходит сбой приложения (EXC_BAD_ACCESS). Как я понимаю, " self.view.layer.sublayers = nil " вызывает исключение. Без этого все в порядке. Но память течет. И через несколько минут воспроизведения приложение вылетало (предупреждение памяти 2). Я не могу решить проблему в течение недели. Я не понимаю, что делать, чтобы освободить мой viewcontroller (или мне нужно освободить все подслои в контроллере?).

Пожалуйста, кто-нибудь, помогите мне. Заранее спасибо.

1 Ответ

0 голосов
/ 02 апреля 2011

Попробуйте включить NSZombieEnabled и проверить Отладчик и Консоль, когда она сломается, она может дать больше информации о проблеме.

P.S. NSZombieEnabled: http://www.cocoadev.com/index.pl?NSZombieEnabled (вы можете попробовать использовать .gdbinit).

P.P.S: Кстати, может быть другая проблема в строке, где "mainGame = [[MainGame alloc] initW ...". - где [выпуск основной игры] называется? (его следует вызывать столько, сколько simpleDiffButtonClicked, который выделяет новый экземпляр MainGame для переменной mainGame (каждый раз))

...