0

我有一个由&组成的UINavigationController对象(名为) ,我的iPad 应用程序首先加载一个子类(名为LoginNavViewController1ViewController2UISplitViewControllermainSplitViewControllerLoginNavdidFinishLaunchingWithOptions

[self.mainSplitViewController presentModalViewController:LoginNav animated:YES];)。

显示ViewController1后,我UIButton在其中点击 a 以 push ViewController2,当我完成工作时,ViewController2我在其中点击 aUIButton以调用[self.navigationController dismissModalViewControllerAnimated:YES];以关闭LoginNav其两个视图控制器并显示mainSplitViewController's内容。

dealloc在两个ViewController1& ViewController2withNSLog语句中都有一个方法,一旦被loginNav解雇,NSLogs永远不会被解雇,但在两者都被解雇后做[self.navigationController.viewControllers objectAtIndex:0] release];& 。[self.navigationController.viewControllers objectAtIndex:1] release];[self.navigationController dismissModalViewControllerAnimated:YES];NSLogs

我把上面的两个release语句注释掉了,然后我启动了Allocationsinstrument,然后再次启动app,pushViewController2然后loginNav按上面描述的dismiss了,看一下Live Bytes(All Allocations value)列就6.9 MB在dismiss之后loginNav,然后我做了这一步再次,但在这种情况下,使用两个发布语句,我在列上得到了一个6.9 MB值。Live Bytes

两个问题:

1)为什么&的dealloc方法在持有它们的导航控制器被解雇后永远不会被解雇?并且执行上述两个发布声明来发布这些视图控制器是否正确?ViewController1ViewController2LoginNav

2)为什么释放ViewController1&ViewController2不释放内存?

ps 没有单个变量(或者在两个&IBOutlet)中都保存在内存中,所有内容都在它们两个中释放。ViewController1ViewController2

4

3 回答 3

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];
}

上述情况可能与您的问题无关。您的问题可能存在于许多不同的领域。这就是解决内存管理问题很困难的原因。没有看到源代码。

于 2012-06-05T15:49:34.487 回答
0

您可能遇到的另一件事是 LoginNav 中的保留属性(例如委托)。

于 2012-06-06T15:40:01.647 回答
0

考虑将您的项目转换为 ARC:

http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2012-06-05T14:31:13.513 回答