UINavigationController, отображаемый модально, не освобождает память при закрытии - PullRequest
0 голосов
/ 05 сентября 2011

У меня проблемы с управлением памятью, когда я представляю UINavigationController, содержащий UITableViewController, в качестве модального представления. Я автоматически освобождаю как UINavigationController, так и UITableViewController, но когда я открываю, а затем закрываю модальное представление при использовании инструмента Allocations, память, которую создает представление, не освобождается при закрытии.

- (void)showOptions {
     OptionsViewController *optionsViewController = [[[OptionsViewController alloc] initWithNibName:@"OptionsViewController" bundle:nil] autorelease];
     UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:optionsViewController] autorelease];
     navController.navigationBar.tintColor = [UIColor lightGrayColor];
     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
         navController.modalPresentationStyle = UIModalPresentationFormSheet;
     }
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissOptions) name:@"dismissOptions" object:nil];
     [[(ApplicationDelegate *)[[UIApplication sharedApplication] delegate] viewController] presentModalViewController:navController animated:YES];
}

- (void)dismissOptions {
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"dismissOptions" object:nil];
     [[(ApplicationDelegate *)[[UIApplication sharedApplication] delegate] viewController] dismissModalViewControllerAnimated:YES];
}

Спасибо за ваше время.

1 Ответ

0 голосов
/ 05 сентября 2011

Прежде всего, когда / где публикуется уведомление "dismissOptions"?Это опубликовано вообще?Живое указывает на то, на что указывает я?Получает ли уведомление?И, возможно, самое главное, какую проблему решает это уведомление?

Контроллеры модального представления автоматически сохраняются, поэтому такого кода должно быть достаточно:

- (void)showOptions {
    OptionsViewController *optionsViewController = [[OptionsViewController alloc] initWithNibName:@"OptionsViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:optionsViewController];
    [self presentModalViewController:navController animated:YES];
    [optionsViewController release];
    [navController release];
}

, а затем в OptionsViewController или любом другом представленииКонтроллер, который может отклонить модальное представление:

[self dismissModalViewControllerAnimated:YES];

(обратите внимание, что здесь достаточно использовать self как вызов dismissModalViewControllerAnimated пузырьков до контроллера представления, который первоначально представлял контроллер модального представления)

...