UIViewController第一次不释放内存

时间:2012-12-23 21:54:33

标签: iphone objective-c cocoa-touch ios4

发生了最奇怪的事情......我有一个非常复杂的UIViewController子类,我通过NIB文件加载它。 我只需执行以下操作即可推送视图:

SecondViewController2 *secV = [[SecondViewController2 alloc]    initWithNibName:@"SecondViewController2" bundle:nil];
        self.secondViewController2 = secV;
[secV release];
[self.navigationController pushViewController:secondViewController2 animated:YES];
[secondViewController2 release];
secondViewController2 = nil;

如您所见,我发布了secondViewController2。

问题是,当我第一次执行它时,在secondViewController2中调用了dealloc方法,我仍然在仪器中观察到额外的2MB,似乎没有被释放。没有任何泄漏,我已经检查了。

当我在第二次,第三次,第四次等时执行以下操作时,dealloc被调用,我不会在内存中观察到任何添加。仅这一点让我相信我没有在我的代码中执行错误,因为相同的代码是第一次,第二次第三次运行,但只有第一次大约2MB没有被释放。正如我所说,对于secondViewController2的dealloc仍在运行!!!

有什么想法吗?这是Apple的机制中的错误吗?

1 个答案:

答案 0 :(得分:2)

首先,如果不分析您的完整实施,就无法彻底回答您的问题。但是,一般来说,如果我理解你的问题,我会说你所描述的情况是正确的。

你应该认为有些行为肯定会对记忆占用产生永久性影响。

例如,如果您通过[UIImage imageNamed]将一些图像加载到内存中,那么您的图像也将进入图像缓存,当加载图像的类被释放时,该图像缓存将不会被清空。另一个很好的例子是单例:单例类在第一次实例化时占用一些内存,它通常永远不会释放它(在程序结束之前 - 当我说单例时,也读取任何类型的静态全局变量)。 p>

这些只是两个例子,但可能还有更多的例子。它可以在您自己的代码中完成,但也可以通过控制器使用的某个框架来完成。如果您的控制器是您在使用某种功能的app中实例化的第一个控制器,则此效果更有可能。但基本上,我不会事先知道,但只有在通过仪器检查你的程序行为之后才能知道。

真正有价值的信息是,在您对控制器类进行连续实例化/释放后,内存占用不会增长。一般来说,这是两件事的标志:

  1. 你的班级没有内存泄漏;

  2. 您的课程没有abandoned memory

  3. 1 + 2意味着程序的整体内存消耗(就控制器而言)是平坦的。 (虽然它有首次使用时支付的费用)。

    因此,在我看来,您的问题至多是控制器对内存使用情况的“优化”。正如我所说,人们应该确切地知道你的控制器确实知道这些2MB是来自某个缓存还是其他任何东西(在某些情况下它也可能不受你的控制)。

    希望它有所帮助。