我有UINavigationController
个对象(名为LoginNav
),其中包含ViewController1
& ViewController2
,我的iPad应用程序首先加载UISplitViewController
子类(名为mainSplitViewController
),然后在其上方以LoginNav
模式显示(这是在{{{ 1}} AppDelegate的方法如下:
didFinishLaunchingWithOptions
)。
显示[self.mainSplitViewController presentModalViewController:LoginNav animated:YES];
后,我点按其中的ViewController1
以推送UIButton
,当我完成ViewController2
工作时,我点按其中的ViewController2
致电UIButton
以使用其两个视图控制器关闭[self.navigationController dismissModalViewControllerAnimated:YES];
并显示LoginNav
内容。
mainSplitViewController's
和{}中都有dealloc
种方法。每个ViewController1
语句ViewController2
,NSLog
被解除后,loginNav
永远不会被解雇,但{{1}}& NSLogs
[self.navigationController.viewControllers objectAtIndex:0] release];
之后[self.navigationController.viewControllers objectAtIndex:1] release];
[self.navigationController dismissModalViewControllerAnimated:YES];
。{/ 1}}
我评论了以上两个发布语句,然后我启动了NSLogs
工具,然后再次启动了应用,推送Allocations
,然后如上所述解散ViewController2
,并查看{ {1}}列(所有分配值)在loginNav
被解雇后立即Live Bytes
,然后我再次执行此步骤,但在这种情况下使用两个发布语句,我得到了一个{{ 1}} 6.9 MB
列上的值。
两个问题:
1)为什么不loginNav
&{在解雇持有它们的导航控制器6.9 MB
后,Live Bytes
永远不会被解雇?并且执行上述两个发布语句来释放这些视图控制器是否正确?
2)为什么发布dealloc
& ViewController1
没有释放记忆?
P.S。在ViewController2
和LoginNav
中,没有单个变量(或ViewController1
保留在内存中,所有内容都会被释放。
答案 0 :(得分:1)
如果不查看所有代码,这些问题几乎不可能排除故障。手动管理内存时,有多个区域可能出错。例如,以下代码将泄漏:
- (void)didSelectSomethingInViewControllerOne
{
ViewController2 *vc2 = [[ViewController2 alloc] init];
[self.navigationController pushViewController:vc2 animated:YES];
}
在这种情况下,您已分配了对象,因此拥有该对象。然后导航控制器获得它的所有权。当您从导航堆栈弹出控制器时,导航控制器会放弃对它的所有权,但您从未这样做过,因此它的保留计数仍为1,并且不会被取消分配。
稍后在代码中放弃控制器的所有权(比如在解除模态视图之后)是一个坏主意。当你的发布到处都很难分析所有权时。一旦导航控制器拥有所有权,您就可以释放您分配的对象,因为您不打算在将来使用它:
- (void)didSelectSomethingInViewControllerOne
{
ViewController2 *vc2 = [[ViewController2 alloc] init];
[self.navigationController pushViewController:vc2 animated:YES];
[vc2 release];
}
上述情况与您的问题无关。您的问题可能存在于许多不同的领域。这就是为什么难以排除内存管理问题的原因。没有看到源代码。
答案 1 :(得分:0)
考虑将项目转换为ARC:
答案 2 :(得分:0)
您可能违反的另一件事是LoginNav中保留的属性(例如代理人)。