当作为模态视图控制器呈现时,ARC UINavigationController堆栈未被释放

3

首先,我将我的应用程序移植到ARC,并且一切似乎都正常。但是现在我发现了一个问题:我有一个UINavigationController,它以模态方式呈现,并带有一些在其堆栈上的UIViewControllers。但是当我关闭模态视图控制器时,堆栈中的视图控制器似乎没有被释放。这是我做的:

UIViewController* root = [[UIViewController alloc] init];
UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:root];
[self presentModalViewController:navi animated:TRUE];

接着我推了一些视图控制器,但这并不重要。实际上,当我稍后调用时

[self dismissModalViewControllerAnimated:TRUE];

根控制器并没有被释放。当然,在我的代码中,root是UIViewController的一个子类,并且我追踪了dealloc和viewDidUnload,但是没有任何东西被调用。

有什么想法吗?

2个回答

3
您的导航控制器里面有什么?可能是其他东西(例如导航控制器内的视图控制器)是罪魁祸首,这意味着导航控制器不会被释放。 无论如何,您发布的代码是正确的,所以如果在调用dismissModalViewController后导航控制器没有被释放,这表明还有其他东西仍然有一个活动引用或其依赖项之一。我知道这并没有回答您的问题,但您可能需要四处寻找。

在UINavigationController内部没有什么特别的,它是标准类。除了上面显示的UINavigationController或UIViewcontroller之外,没有更多的引用。我不想发布太多不必要的代码。但我即将对这个主题进行一些实验,并稍后发布我的结果... - benjamin.ludwig
好的,好的,我实际上找到了一个对ViewController的强引用(可惜我)。它作为另一个自定义类的代理,并且委托被声明为id <ScanManagerDelegate> delegate; 在ARC下默认为__strong。对此感到抱歉!所以,对于所有在ARC下使用委托的人们:如果迁移工具没有为您执行此操作,请将其设置为弱引用! - benjamin.ludwig
不用道歉 - 这个知识很有用!当我需要迁移一个项目时,这是我必须注意的事情。 - lxt

1

由于您没有展示实际的代码,很难确定您的根视图控制器出了什么问题。

但是,在ARC中,如果您对一个对象有强引用,它就不会被释放。我怀疑您在将其添加到导航控制器后仍然持有该控制器。

但是,没有看到您的代码,我无法确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接