我的应用程序中的第一个视图只需要显示一次。
我在自定义segue中使用以下内容,将其从导航控制器堆栈中移除并转换到新的:
- (void)perform {
UINavigationController *nav = [self.sourceViewController navigationController];
NSArray *viewControllers = [NSArray arrayWithObject:self.destinationViewController];
[nav setViewControllers:viewControllers animated:YES];
}
虽然我能够确认调用了dealloc
方法,但内存使用量并没有下降。我100%肯定,内存是由ViewController分配的,我希望它会被释放,因为它包含一个非常大的图像(UIImageView)而另一个视图控制器很小(内存方面)。
我也很确定,我没有在任何其他地方对所包含的元素进行任何引用。
难道UIImageView会将图像保留在内存中,以防再次需要吗?
我正在做什么,甚至是一个好方法去? (我的灵感来自this)
答案 0 :(得分:3)
作为快速测试的结果,我推断在Interface Builder中设置图像的图像视图似乎正在进行一些缓存。我假设它与imageNamed
使用的imageWithContentsOfFile:
:
如果您的图像文件只显示一次,并希望确保它不会添加到系统的缓存中,则应使用
imageNamed
创建图像。这会将您的一次性图像保留在系统图像缓存之外,从而可能会改善应用程序的内存使用特性。
我不知道有任何方法来模拟将导致此缓存被清除的内存压力(除了明显做足够的分配以导致实际的内存压力)。各种缓存通常不会奇怪地响应模拟器的“模拟内存警告”,即使它们确实响应了真正的内存压力。 (此外,由于位置服务,您正在物理设备上进行测试。)
但是你可以通过不在Interface Builder中设置图像来测试这是否确实是问题,而是以编程方式进行(并且不使用NSString *path = [[NSBundle mainBundle] pathForResource:@"imagename" ofType:@"png"];
self.imageView.image = [UIImage imageWithContentsOfFile:path];
进行),例如:
{{1}}
在我的测试中,当我解除在Interface Builder中设置图像的场景时,我没有像使用上面的代码那样恢复内存。