0

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

4

3 回答 3

0

替换此行

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

image = [UIImage imageWithContentsOfFile:imgPath];

并检查一次。

于 2013-10-03T10:49:04.870 回答
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 内存管理。

于 2013-10-03T12:41:13.360 回答
0

首先,切换到 ARC。在 iOS 上,没有一件事可以通过一次移动就能更好地改进代码并消除所有类型的内存问题。

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

  • 你在IBNewsViewController其他地方泄漏
  • IBNewsViewController错误地弄乱了它tabBarItem并泄漏了
  • 你在UINavigationController其他地方泄漏
  • 您保留在tabBarItem.image其他地方并且未能释放它

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

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

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

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

当然,切换到 ARC。

于 2013-10-03T12:53:34.787 回答