0

Instrumentsリークは、このコードがリークすると言っています:

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

名前はリークオブジェクトです。奇妙なことがいくつかあります。リークするのは時々だけで、常にではありません(このコードスニペットは、アプリの通常の実行中に数百回実行されますが、リークは3〜4回だけです)。もう1つの奇妙なことは、名前オブジェクトが自動解放オブジェクトであり、明示的に保持または解放されることはないということです。それでは、どのようにしてリークされたのでしょうか。

スタックを見ると、substringWithRangeはsubstringToIndexによって呼び出されるので、問題はsubstringToIndexメソッドにあると思います。

4

2 に答える 2

1

リークは時々誤検知を報告します。投稿したコードは問題ないように見えるので、周囲のコードが問題を引き起こしていないかどうかを確認してください。特に、多くのメモリ管理のバグを検出できるBuild&Analyzeを使用してください。問題が見つからない場合は、問題が存在しない可能性があります(この特定のケースでは、この特定のツールを使用しています)。

Bill Bumgarnerは、リークが失敗した場合に成功する可能性のあるヒープショット計測器を使用した、別のデバッグ戦術について説明しています。

于 2010-10-17T14:11:24.343 に答える
0

上記で提供したコードはリークを示していませんが、リークがこの行でリークが発生したことを示している場合は、次のようになります。

actualLayer = lay;

次に、actualLayerが割り当てられたり、保持されたり、コピーされたりする前の場所を調べます。99%の確率で、リークは魔法のような「修正が必要な場所」ではありません。それはもっと「あなたがリークしたことを私が発見した場所です、覚えておいてください、リークはこの時点の前のある時点で起こったのです」。

于 2010-10-17T14:31:07.817 に答える