iPhone - substringToIndex / substringFromIndex / substringWithRange内存泄漏

时间:2010-10-17 13:58:28

标签: iphone memory substring memory-leaks autorelease

仪器泄漏说这个代码泄漏了:

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

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

看一下堆栈,substringWithRange由substringToIndex调用,所以问题我认为它在substringToIndex方法中。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

虽然上面提供的代码没有泄漏,但如果泄漏说这条线路发生了泄漏:

actualLayer = lay;

然后查看在分配,保留,复制等实际层之前的任何地方。在99%的情况下,泄漏并不是一个神奇的“这里就是你需要解决问题的地方”。更多的是“这是我发现你泄露的地方,请记住,在此之前的某个时间发生了泄漏。”