【问题标题】:iPhone - substringToIndex / substringFromIndex / substringWithRange memory leakiPhone - substringToIndex / substringFromIndex / substringWithRange 内存泄漏
【发布时间】:2011-04-26 14:15:55
【问题描述】:

仪器泄漏说此代码泄漏:

NSString *name = [file substringToIndex:i];
Layer *actualLayer = nil;
for (Layer *lay in layers) {
    if ([lay.layerName isEqual:name]) {
        actualLayer = lay;
    }
}

name 是泄漏对象。有一些奇怪的事情:它只是有时泄漏,并不总是(这个sn-p代码在我的应用程序正常执行期间执行了数百次,但它只泄漏了3-4次)。另一个奇怪的事情是,我认为 name 对象是一个自动释放对象,它从来没有明确地保留或释放,那么它怎么可能泄露了?

看堆栈,substringWithRange是由substringToIndex调用的,所以我认为是substringToIndex方法的问题。

【问题讨论】:

  • 这段代码看起来确实不错。请记住,并非所有活着的东西实际上都在泄漏。也许给静态分析器一个机会!

标签: iphone memory substring memory-leaks autorelease


【解决方案1】:

泄漏偶尔会报告误报。您发布的代码看起来不错,因此请检查周围的代码是否可能导致问题。特别是,使用 Build & Analyze 可以发现许多内存管理错误。如果您找不到问题,则有可能它不存在(在这种特殊情况下使用此特定工具)。

Bill Bumgarner 描述了另一种调试策略,using the heapshot instrument,它可以在泄漏失败的情况下成功。

【讨论】:

  • 那么可能的赢家是 Leaks 并不完美。静态分析器是一种更加科学的技术。
【解决方案2】:

虽然您在上面提供的代码显示没有泄漏,但如果泄漏表明这一行发生了泄漏:

actualLayer = lay;

然后查看actualLayer 被分配、保留、复制等之前的任何地方。99% 的情况下,泄漏并不是一个神奇的“这里正是你需要修复的地方”。更多的是“这是我发现你泄露的地方,记住,泄露发生在此之前的某个时间。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2023-03-24
    • 2011-10-22
    • 2010-11-23
    • 2011-12-10
    • 2011-05-24
    相关资源
    最近更新 更多