图像中的内存泄漏

时间:2013-10-03 10:29:37

标签: objective-c memory uiimage memory-leaks

我正在使用xcode 4中的分析器来确定我是否有任何内存泄漏。我以前没有这个泄漏,但是使用xcode 5我有这个。

我正在尝试为我的`UIViewController的标签项设置图像,并且探查器标记了这一行:

    image = [[UIImage alloc] initWithContentsOfFile:imgPath];   <<=== Leak : 9.1%

这是我的代码的一部分,我不明白为什么。解决此问题的最佳方法是什么?

    NSString *imgPath;
    UIImage *image;

    IBNewsViewController *newsView = [[IBNewsViewController alloc] initWithURL:[tvLocal urlFlux] title:@"News" isEmission:NO];
    [newsView setTitle:@"News"];
    imgPath = [[NSBundle mainBundle] pathForResource:"news" ofType:@"png"];
    image = [[UIImage alloc] initWithContentsOfFile:imgPath];   <<=== Leak : 9.1%
    newsView.tabBarItem.image = image;
    [image release];
    image = nil;
    UINavigationController* navNew = [[UINavigationController alloc] initWithRootViewController:newsView];
    [newsView release];
    newsView = nil;

编辑: iOS6没有泄漏。

为什么它在iOS7上泄漏?

3 个答案:

答案 0 :(得分:0)

替换此行

image = [[UIImage alloc] initWithContentsOfFile:imgPath]; 

使用

image = [UIImage imageWithContentsOfFile:imgPath];

并检查一次。

答案 1 :(得分:0)

您应该切换到自动释放imageNamed:方法。这具有系统级缓存图像的额外好处。

NSString *imgPath;
UIImage *image;

IBNewsViewController *newsView = [[IBNewsViewController alloc] initWithURL:[tvLocal urlFlux] title:@"News" isEmission:NO];
[newsView setTitle:@"News"];

image = [UIImage imageNamed: @"news"];   
newsView.tabBarItem.image = image;

UINavigationController* navNew = [[UINavigationController alloc] initWithRootViewController:newsView];
[newsView release];
newsView = nil;

为了让自己的生活更轻松,我会将您的项目切换为使用ARC,这样您就不必担心WRT内存管理了。

答案 2 :(得分:0)

首先,switch to ARC。在iOS上没有任何一件事可以通过一次移动来更好地改进代码并消除整个类别的内存问题。

除此之外,上面的代码本身似乎没有泄漏。这表明实际的错误在其他地方。有几种方法可以实现:

  • 你正在泄漏其他地方的IBNewsViewController
  • IBNewsViewController混淆tabBarItem错误并泄露
  • 你正在泄漏其他地方的UINavigationController
  • 您将tabBarItem.image保留在其他地方并且未能将其发布

我最有可能追捕。如果你直接访问ivars,那往往会导致这些错误。您应该在initdealloc之外的任何地方使用访问者。 (在ARC中也是如此,但如果没有ARC,这绝对是至关重要的。)

泄漏检测并不完美。有各种各样的“废弃”记忆可能看起来不是泄密。我经常建议使用Heapshot(现在的“生成”)分析来查看可能放弃的其他对象;这可能会让你更好地了解这种泄漏。

为什么iOS 6与iOS 7存在差异?我怀疑你在iOS 6上遇到了同样的问题,但它看起来并不像是“漏洞”,可能是因为缓存了iOS 7中删除的图像。缓存指针可能会让它看起来不像是漏洞仪器。

说到这一点,确保运行静态分析器。它可以帮助您找到问题。

当然,请切换到ARC。