iPhone / iPad UIImage initWithContentsOfFile:

时间:2012-02-24 16:22:16

标签: iphone objective-c ipad memory-leaks uiimage

我已编写代码,当您点击按钮时,它会打开包含图像的新屏幕。在那个新屏幕上有一个关闭屏幕的按钮,然后返回主屏幕。如果我这样做(没有泄漏等......),它的工作正常:

img = [UIImage imageNamed: @"Galaxy"];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];

但是,如果我用这样的代码替换这行代码:

img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Minnesota" ofType:@"png"]];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];
[img release];

它充当我的内存泄漏。每次我打开图像屏幕,应用程序都会占用越来越多的内存。但所有dealloc都被调用,甚至[img retainCount]在最终发布之前显示1。这里是否有可能存在错误,因为我找不到什么错误?

编辑:

这是ImageDisplay的dealloc方法,此方法被调用:

 -(void) dealloc {
     [img release];
     [super dealloc];
 }

3 个答案:

答案 0 :(得分:3)

您的ImageDisplay *display正在保留图片。应该如此。当您释放它时,它应该释放所有保留的实体。在你展示的代码中,你没有发布它。典型的用途是告诉包含视图控制器以模态或其他方式显示它(或将其推送到导航控制器上)并释放它,将其保留生命周期留在现在管理它的任何视图控制器的手中。不同之处在于,在您的第一个代码示例中,*img是自动释放的,并且会在适当的时候自行释放,而在第二个代码示例中,它不是。

ARC会在这里保存您的培根,并大大简化您的代码。

另外你应该谷歌术语“静态方法”,因为你真的很难将静态方法称为对象类的实例,就像绕过你的屁股来到达你的肘部。

另外,请停止查看retainCount。各种各样的东西可能会将您的对象保留在框架的底层。使用retainCount作为调试策略的一部分是confusionville的单程票。

答案 1 :(得分:0)

请注意,由于imageNamed:是一个类方法而不是实例方法,因此您可以像这样使用它:

UIImage *myImage = [UIImage imageNamed:@"pony.png"];

使用initWithContentsOfFile发布的代码看起来是正确的,因此泄漏必须位于ImageDisplay类的某个位置。

答案 2 :(得分:0)

尝试使用这个,你不需要分配和释放:

 [UIImage imageWithContentsOfFile:(NSString *)name]