我创建了一个示例应用程序,其中我将基本的全屏大小UIImageView设置为背景。这个程序很简单。它只是2页。 (我将在下面发布代码)。 NIB仅作为UIImageView。我尝试了两种不同的场景 -
发布NIB文件和图片是否有问题。
我一直在经历一些内存泄漏。
1)示例1(BAD) - 我将图像直接加载到NIB中。当我推动视图时,内存增加了5MB。当我弹出(使用NavigationController)顶部的View时,内存只下降了1.5MB。 Dealloc确实被称为。我没有IBOutlets。所以,对我而言,这是在某处某处缓存或保留此图像。
2)示例2(GOOD) - 为UIImage视图设置IBOutlet,我将图像放在UIImageview中,如下所示(我知道我可以通过编程方式创建UIImageView,但我在这里测试内存而不是我的屏幕创建技巧)。这样可以很好地清理。它从内存中删除了图像,我可以在仪器中看到内存中断了。
@interface Page3VC : UIViewController {
UIImageView*backimage;
}
@property(retain, nonatomic) IBOutlet UIImageView*backimage;
end
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
backimage.image = [self getImage:@"hipHome.png"];
}
-(void)viewDidDisappear:(BOOL)animated {
backimage.image = nil;
[super viewDidDisappear:animated];
}
-(UIImage*)getImage:(NSString*)imageName{
//return [UIImage imageNamed:imageName];
return [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]];
}
答案 0 :(得分:3)
通过NIB加载图像可能会出现问题 - 由于缓存行为而导致“泄漏”,但这是设计原因 - 请参阅this question。此缓存对于在UITables中显示小图像(高性能)非常有用,但不适合将单个巨大图像加载到UI中。
我们需要查看更多代码!如何定义getImage
?
如果您在自己的代码中的任何位置使用UIImage imageNamed:
,您应该知道它会将加载的图像缓存在内存中。 Dealloc'ing这样的图像实际上不会将缓存的图像卸载到内存中!
欲了解更多信息,请参阅:
Difference between [UIImage imageNamed...] and [UIImage imageWithData...]?
答案 1 :(得分:0)
并且请在加载/初始化UIViewController子类的位置发布代码...
并在哪里发布它......
我的意思是,我们看到你的类中加载了对象,但是当你加载并使用你的类(应用程序委托?rootMainUIViewController /导航控制器?)时,问题可能就在它之外了。