我正在使用从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];
感谢您的帮助!
更新:
请忽略这个问题,显然这是一个错误。 :(
最后解决问题...不改变任何代码,而是重建项目。 :(
答案 0 :(得分:1)
首先,你不应该是UINavigationController的子类:
此类不适用于子类。
这条线做什么?
controller.parent = self;
如果控制器保留父属性,则您有一个保留周期,这将导致您描述的问题。请记住,UINavigationController堆栈中的所有视图控制器都可以使用-navigationController属性访问导航控制器。
答案 1 :(得分:0)
UIViewController开始被解雇和释放之间存在差异。 当你解雇它时,它可以随时释放,但不一定立即释放。
你确定你有内存泄漏吗?也许拾取器在dimiss之后几秒钟被释放。
如果您确实有内存泄漏,这意味着还有另一个地方可以保留选择器。