NIB文件中的内存管理和UIImageViews

时间:2011-03-15 17:33:19

标签: iphone ipad memory memory-leaks uiimageview

我创建了一个示例应用程序,其中我将基本的全屏大小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]];
}

2 个答案:

答案 0 :(得分:3)

通过NIB加载图像可能会出现问题 - 由于缓存行为而导致“泄漏”,但这是设计原因 - 请参阅this question。此缓存对于在UITables中显示小图像(高性能)非常有用,但不适合将单个巨大图像加载到UI中。

我们需要查看更多代码!如何定义getImage

如果您在自己的代码中的任何位置使用UIImage imageNamed:,您应该知道它会将加载的图像缓存在内存中。 Dealloc'ing这样的图像实际上不会将缓存的图像卸载到内存中!

欲了解更多信息,请参阅:

Difference between [UIImage imageNamed...] and [UIImage imageWithData...]?

答案 1 :(得分:0)

在方案2中,您还应该在将其设置为nil之前释放backimage ...

并且请在加载/初始化UIViewController子类的位置发布代码...

并在哪里发布它......

我的意思是,我们看到你的类中加载了对象,但是当你加载并使用你的类(应用程序委托?rootMainUIViewController /导航控制器?)时,问题可能就在它之外了。