【问题标题】:NSNumber Leaking memory numberWithInt inside a For loopNSNumber 在 For 循环中泄漏内存 numberWithInt
【发布时间】:2011-08-03 16:07:58
【问题描述】:

NSNumber for 循环内的内存泄漏 - 在 OSX Lion 上的 Xcode Instruments 版本 4.1 开始发生 - 这是在使用仪器在设备配置文件上执行时泄漏。任何想法表示赞赏。

        int currentActivityScore = [self.activityScore intValue];
        int deltaCriteriaScore = [[segmentItemArray objectAtIndex:3] intValue];
        int newActivityScore = currentActivityScore + deltaCriteriaScore;
        self.activityScore = [NSNumber numberWithInt:newActivityScore];

我也试过这个代码,还是有泄漏!!!

        int currentActivityScore = [self.activityScore intValue];
        int deltaCriteriaScore = [[segmentItemArray objectAtIndex:3] intValue];
        int newActivityScore = currentActivityScore + deltaCriteriaScore;
        NSNumber *newActivityScoreNumber = [[NSNumber alloc] initWithInt:newActivityScore];
        self.activityScore = newActivityScoreNumber;
        [newActivityScoreNumber release];

【问题讨论】:

  • 您将activityScore 声明为retain 还是copy
  • 您放弃在-dealloc 中的activityScore 的所有权吗?
  • 当您指向它时,这不是泄漏。仪器将指向它创建的位置,以说明泄漏的“原因”,但真正的原因是你没有彻底摆脱它。你如何处理这个 ivar?
  • 保留。我也没有提到这是在执行 10 个循环的 For 循环中运行的。
  • 我在视图卸载和dealloc中都调用了self.activityScore = nil。我也尝试过发布,但没有成功。

标签: iphone ios xcode memory


【解决方案1】:

假设activityScore 保留或复制其值,那么我认为您的代码是可以的。

Instruments 提供误报(或错过真正的泄漏)并非闻所未闻。将其视为指向代码的指针以进行仔细检查,而不是保证泄漏。

【讨论】:

  • 它提供了一个泄漏,我发现只有当我把它放在 For 循环中时才会发生这种泄漏
  • 您向我们展示的代码没有泄漏。您需要向我们展示更多代码,或者您需要接受这是 Instruments 的误报。
  • 这对我有用:我只是没有在循环内进行计算,我创建了局部变量,只有在 For 循环之后我才将它们分配给类属性 - 这摆脱了问题
  • 您认为 Instruments 是绝对可靠的。它不是。如果您没有定义自定义访问器并且循环外的代码中没有泄漏,那么循环内部也没有泄漏。
  • 那怎么能在这个问题上给苹果发一个bug呢?
【解决方案2】:
NSNumber *newActivityScoreNumber = [NSNumber numberWithInt:newActivityScore];
self.activityScore = newActivityScoreNumber;

所以这里 NSNumber 是自动释放的。你不必为此烦恼。

【讨论】:

  • 当我把它放在一个循环中时,它们都会为我泄漏内存。
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多