iPhone - Dealloc subview UIViewController при removeFromSuperview

У меня есть несколько кнопок на моем основном UIViewController (главном меню), которые создают и добавляют подпредставление UIViewController поверх главного меню. Когда я удаляю подпредставление, память этого контроллера не освобождается. Как я могу мгновенно освободить память от вложенных представлений?

У кого-нибудь есть пример? Это решило бы все мои проблемы! Заранее спасибо.

Вот как я добавляю подвид

if((UIButton *) sender == gameClassicBtn) {
        GameClassic *gameClassicController = [[GameClassic alloc] 
                             initWithNibName:@"GameClassic" bundle:nil]; 
        self.gameClassic = gameClassicController;
        [gameClassicController release]; 
        [self.view insertSubview:gameClassicController.view atIndex:1];
    }

person bbullis21    schedule 21.09.2009    source источник


Ответы (1)


На основе предоставленного вами кода может быть как минимум два места, где UIViewController сохраняется: одно - иерархией представлений (self.view), а другое - переменной-членом (self.gameClassic). Похоже, вы освобождаете только ссылку на иерархию представлений, но не переменную-член. Если вы отпустите последний, освободит ли он UIViewController?

person fbrereto    schedule 21.09.2009
comment
Я никогда ничего не отпускаю внутри кода главного меню ... Вот где лежит приведенный выше код. Я не уверен, как сказать этому файлу, что я удалил gameClassic.h из представления. Я удаляю это Subview с помощью [self.view removeFromSubview]; чтобы вернуться в главное меню. - person bbullis21; 21.09.2009
comment
В основном, в чем моя проблема, я вызываю вставку Subview, нажав кнопку в главном меню. После завершения короткой игры я делаю removeFromSubview, память из этого subview не освобождается сразу. Поэтому, если они выбирают другую кнопку в главном меню, загружается другое подвид, и объектный массив продолжает строиться. - person bbullis21; 21.09.2009
comment
Я бы временно (акцент на временном) переопределил сохранение и освобождение в вашем классе GameClassic и поставил точку останова в каждом. Таким образом, вы можете видеть, когда ваш экземпляр сохраняется и освобождается, что позволяет узнать, где нужно удалить лишние счетчики ссылок. - person fbrereto; 21.09.2009
comment
Все мои IBOutlets выпускаются в моем - (void) dealloc в моем файле gameClass.m. Я знаю, что я не должен на самом деле вызывать [self dealloc]. Рекомендуется создать функцию - (void) ReleaseView, которую я мог бы вызвать, чтобы освободить все из gameClassic перед удалениемFromSubview? - person bbullis21; 21.09.2009
comment
Я бы порекомендовал отменить удержание и освобождение, чтобы выяснить, откуда берется запасной фиксатор, а затем отпустить его в нужном месте. Это был бы лучший способ решить вашу проблему без добавления ненужного кода. - person fbrereto; 21.09.2009