使用模态视图控制器内的UINavigationController进行内存管理

时间:2010-10-30 18:26:17

标签: iphone memory-management ios

我正在尝试显示包含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 个答案:

答案 0 :(得分:1)

你是自动释放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];

答案 1 :(得分:0)

正在创建“Controller”,并将其用作“rootViewController” - 但实际上从未显示过。因此,虽然通常会由显示它的人保留 - 但没有人这样做。

我对你为什么这样做感到有点困惑 - 但我猜这是你发布的“控制器”导致了这个问题。

你可以通过在modalNavController消失之前不释放它来解决这个问题 - 但我不知道你为什么甚至在第一时间这样做。