释放UIViewController子类实际上并没有释放内存

时间:2012-06-05 13:51:11

标签: objective-c ios xcode ipad memory-management

我有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语句ViewController2NSLog被解除后,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。在ViewController2LoginNav中,没有单个变量(或ViewController1保留在内存中,所有内容都会被释放。

3 个答案:

答案 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)

答案 2 :(得分:0)

您可能违反的另一件事是LoginNav中保留的属性(例如代理人)。