Используйте UINavigationController как модальное представление, и представление не освобождается после отклонения - PullRequest
0 голосов
/ 13 января 2012

Я использую класс, унаследованный от UINavigationController, представленный в качестве модального вида, на панели навигации у меня есть кнопка «Готово», которая будет отклонять модальный вид, когда пользователь нажимает на него. Все ведет себя нормально, кроме dealloc () в ImagePickerController, GroupPickerController (который инициализируется как корневое представление) не вызывается, когда я отклоняю модальное представление. Это вызывает утечку памяти.

Вот код, использующий его:

ImagePickerController *picker = [[ImagePickerController alloc] initWithRootViewController:nil];

// don't show animation since this may cause the screen flash with white background. 
[self presentModalViewController:picker animated:NO];

picker.navigationBar.barStyle = UIBarStyleBlack;
[picker release];

Вот что находится внутри ImagePickerController, который является UINavigationController:

 - (id)initWithRootViewController:(UIViewController *)root {

    GroupPickerController *controller = [[GroupPickerController alloc] initWithNibName:nil bundle:nil];
    self = [super initWithRootViewController:controller];
    [controller release];
    if (self) {
        self.modalPresentationStyle = UIModalPresentationPageSheet;
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

-(void) dismiss
{
    [self.navigationController setViewControllers:nil];
    [self dismissModalViewControllerAnimated:YES];
}

Вот код в GroupPickerController, это ответ на кнопку на панели навигации, чтобы закрыть модальное представление:

...
#pragma mark - button actions
- (void)done {
    [self.parent dismiss];
}

Я пытался вручную удалить представления из NavigationController, похоже, не дал никакого эффекта ... [self.navigationController setViewControllers: nil];

Спасибо за помощь!


ОБНОВЛЕНИЕ:

Пожалуйста, не обращайте внимания на этот вопрос, очевидно, это ошибка. (

Наконец-то решите проблему ... не меняйте код, а пересоберите проект. :(

Ответы [ 2 ]

1 голос
/ 13 января 2012

Прежде всего, вам не следует создавать подклассы UINavigationController:

Этот класс не предназначен для создания подклассов.

Что делает эта строка?

controller.parent = self;

Если контроллер сохраняет свойство parent, у вас есть цикл сохранения, который вызовет описанную вами проблему.Помните, что все контроллеры представления в стеке UINavigationController могут обращаться к контроллеру навигации с помощью свойства -navigationController.

0 голосов
/ 13 января 2012

Существует разница между UIViewController, начинающим распускать и освобождать.Когда вы отклоняете его, он может быть освобожден в любой момент, но не обязательно сразу.

Вы уверены, что у вас есть утечка памяти?Возможно, сборщик освобождается через несколько секунд после исчезновения.

Если у вас действительно есть утечка памяти, это означает, что есть другое место, где вы выбираете сборщик.

...