Управление памятью с помощью UINavigationController внутри Modal View Controller - PullRequest
0 голосов
/ 30 октября 2010

Я пытаюсь отобразить контроллер модального представления, содержащий NavigationController.Я не могу понять, где освободить контроллеры, хотя.Обычно я просто отпускаю контроллер после его отображения, но здесь это не сработает;по-видимому, это как-то связано с навигационным контроллером.Любая помощь будет отличной!Вот этот код:

-(IBAction)displayCreateModifyExerciseViewController:(id)sender {    
    CreateModifyExerciseViewController *controller = [[CreateModifyExerciseViewController alloc] initWithNibName:@"CreateModifyExerciseView"
                                                                                                          bundle:nil];
    controller.delegate = self;
    controller.title = @"Create Exercise";
    UINavigationController *modalNavController = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease];
    modalNavController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    controller.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save"
                                                                                    style:UIBarButtonItemStyleDone
                                                                                   target:controller
                                                                                   action:@selector(done:)];
    [self presentModalViewController:modalNavController animated:YES];
    //I want to say [controller release];
    //              [modalNavController release];
    //But that causes a crash because controller ends up dealloc-ing.
}

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Вы автоматически выпускаете modalNavController, а также специально освобождаете его, из-за чего он преждевременно освобождается.Либо авто-релиз, либо специально релиз, но попробуйте не делать и то, и другое одновременно.

Итак:

CreateModifyExerciseViewController *controller = [[[CreateModifyExerciseViewController alloc] initWithNibName:@"CreateModifyExerciseView" bundle:nil] autorelease];
controller.delegate = self;
controller.title = @"Create Exercise";
UINavigationController *modalNavController = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease]; // <-- you originally autorelease here
modalNavController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
                         initWithTitle:@"Save" 
                                 style:UIBarButtonItemStyleDone
                                target:controller
                                action:@selector(done:)] autorelease]; // <-- this was leaking in your code -- needs to be autoreleased
[self presentModalViewController:modalNavController animated:YES];
// Don't release now because everything was autoreleased

ИЛИ специально освободите все:

CreateModifyExerciseViewController *controller = [[CreateModifyExerciseViewController alloc] initWithNibName:@"CreateModifyExerciseView" bundle:nil];
controller.delegate = self;
controller.title = @"Create Exercise";
UINavigationController *modalNavController = [[UINavigationController alloc] initWithRootViewController:controller]; // <-- you originally autorelease here
modalNavController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
                         initWithTitle:@"Save" 
                                 style:UIBarButtonItemStyleDone
                                target:controller
                                action:@selector(done:)] autorelease]; // <-- this was leaking in your code -- needs to be autoreleased
[self presentModalViewController:modalNavController animated:YES];
// Now we specifically release the controllers because the call to -presentModalViewController:animated: owns them
[controller release];
[modalNavController release];
0 голосов
/ 30 октября 2010

«Контроллер» создается и используется как «rootViewController» - но фактически никогда не отображается. Таким образом, в то время как это обычно сохранялось бы тем, кто показывает это - никто не сделал этого.

Я немного озадачен, почему вы это делаете, но я предполагаю, что именно ваш релиз "контроллера" вызывает проблему.

Технически можно решить проблему, не выпуская ее до тех пор, пока не исчезнет modalNavController - но я не знаю, почему вы вообще это делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...