1

发生了最奇怪的事情......我有一个非常复杂的 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机制中的错误吗?

4

1 回答 1

2

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

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

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

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

对您来说真正有价值的信息是,在控制器类的连续实例化/释放时,内存占用不会增加。一般来说,这是两个方面的标志:

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

  2. 你的课没有放弃记忆

1+2 意味着程序的整体内存消耗(就您的控制器而言)是平坦的。(尽管您在首次使用时需要支付费用)。

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

希望能帮助到你。

于 2012-12-23T22:27:13.133 回答