2

我的应用程序中的第一个视图只需要显示一次。

我在自定义 segue 中使用以下内容,将其从导航控制器堆栈中取出并转换到新的:

- (void)perform {
    UINavigationController *nav = [self.sourceViewController navigationController];
    NSArray *viewControllers = [NSArray arrayWithObject:self.destinationViewController];
    [nav setViewControllers:viewControllers animated:YES];
}

虽然我能够确认该dealloc方法被调用,但内存使用量并没有下降。我 100% 确定,内存是由 ViewController 分配的,我希望它会被释放,因为它包含一个非常大的图像(UIImageView)而另一个视图控制器很小(内存方面)。

我也确信,我在其他任何地方都没有对包含的元素进行任何引用。

是不是 UIImageView 将图像保存在内存中,以防再次需要它?

我正在做的事情甚至是一个好方法吗?(我受此启发)

4

1 回答 1

3

作为快速测试的结果,我推断在 Interface Builder 中设置了图像的图像视图似乎正在做一些缓存。我认为它与使用的缓存机制相同imageNamed,其文档说

如果您有一个只显示一次的图像文件并希望确保它不会被添加到系统的缓存中,您应该改为使用imageWithContentsOfFile:. 这将使您的一次性图像远离系统图像缓存,从而潜在地改善您的应用程序的内存使用特性。

我不知道有什么方法可以模拟会导致此缓存被清除的内存压力(除了显然做了足够的分配以导致实际的内存压力)。各种缓存通常不会奇怪地响应模拟器的“模拟内存警告”,即使它们确实响应了真正的内存压力。(此外,由于位置服务,您正在物理设备上进行测试。)

但是您可以通过不在 Interface Builder 中设置图像来测试这是否确实是问题,而是以编程方式进行(并且在不使用的情况下进行imageNamed),例如:

NSString *path = [[NSBundle mainBundle] pathForResource:@"imagename" ofType:@"png"];
self.imageView.image = [UIImage imageWithContentsOfFile:path];

在我的测试中,当我关闭在 Interface Builder 中设置图像的场景时,我不会像使用上面的代码那样恢复尽可能多的内存。

于 2013-09-11T00:28:15.527 回答