2010-10-30 9 views
0

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

-(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. 
} 

ответ

0

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

Я немного смущен, почему вы это делаете, но я предполагаю, что это ваш выпуск «контроллера», который вызывает проблему.

Вы можете технически исправить проблему, не выпуская ее до тех пор, пока модальныйNavController не исчезнет, ​​но я не знаю, почему вы даже это делаете в первую очередь.

+1

Контроллер который отображается контроллером навигации (modalNavController). Она должна освободить его. Ошибка возникает из-за того, что он как autoreleases 'modalNavController', так и специально освобождает его (в своем комментарии). Вот что вызывает крах. –

+0

Вы правы! – Brad

+0

Спасибо! Я никогда не автореклама ничего, если это возможно, поэтому я не заметил, что я случайно положил его туда! Я мог бы найти часы (думаю, я * действительно * уже искал часы, но ...) и не видел этого! – nosirrahcd

1

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

Итак:

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]; 
Смежные вопросы