【问题标题】:Memory leak in image图像中的内存泄漏
【发布时间】:2013-10-03 10:29:36
【问题描述】:

我正在使用 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 上泄露?

【问题讨论】:

    标签: objective-c memory uiimage memory-leaks


    【解决方案1】:

    您应该切换到自动释放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 内存管理。

    【讨论】:

    • 我正在使用 Arc,我得到一些泄漏 [imageview setImage:[UIImage imageNamed:@"img-568h@2x"]];目前只在模拟器中
    【解决方案2】:

    替换这一行

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

    image = [UIImage imageWithContentsOfFile:imgPath];
    

    并检查一次。

    【讨论】:

      【解决方案3】:

      首先,switch to ARC。在 iOS 上,您可以做的任何事情都无法通过一次移动就能更好地改进您的代码并消除所有类别的内存问题。

      除此之外,上面的代码本身似乎没有泄漏。这表明实际的错误在其他地方。发生这种情况的方式有多种:

      • 您在其他地方泄露了 IBNewsViewController
      • IBNewsViewController 错误地与 tabBarItem 混淆并泄漏
      • 您将UINavigationController 泄露到其他地方
      • 您将 tabBarItem.image 保留在其他地方,但未能释放它

      那些是我最有可能寻找的。如果您直接访问 ivars,通常会导致此类错误。除了initdealloc 之外,您应该在任何地方使用访问器。 (这在 ARC 中是正确的,但在没有 ARC 的情况下绝对至关重要。)

      泄漏检测并不完美。有各种“废弃”的内存可能看起来不是泄漏。我经常推荐使用Heapshot(现在的“Generation”)分析,看看还有哪些对象可能被抛弃;这可能会让您更好地了解此泄漏。

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

      说到这,请确保运行静态分析器。它可以帮助您发现问题。

      当然,切换到 ARC。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2017-01-27
        • 2016-08-10
        • 2015-10-08
        相关资源
        最近更新 更多