使用UINavigationController作为模态视图,并且在关闭后不会释放视图

时间:2012-01-13 09:49:58

标签: ios memory-management memory-leaks uinavigationcontroller

我正在使用从UINavigationController继承的类作为模态视图,在导航栏中我有一个“完成”按钮,当用户点击它时将关闭模态视图。除了ImagePickerController中的dealloc()之外,一切都表现正常,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 个答案:

答案 0 :(得分:1)

首先,你不应该是UINavigationController的子类:

  

此类不适用于子类。

这条线做什么?

controller.parent = self;

如果控制器保留父属性,则您有一个保留周期,这将导致您描述的问题。请记住,UINavigationController堆栈中的所有视图控制器都可以使用-navigationController属性访问导航控制器。

答案 1 :(得分:0)

UIViewController开始被解雇和释放之间存在差异。 当你解雇它时,它可以随时释放,但不一定立即释放。

你确定你有内存泄漏吗?也许拾取器在dimiss之后几秒钟被释放。

如果您确实有内存泄漏,这意味着还有另一个地方可以保留选择器。