0

このコードを使用してコンテンツをNSArrayにロードしていますが、正常に機能しているようですが、リークを検出するInstrumentは、指を置くことができない問題があることを示しています。

    - (void) loadPlan: (NSString  *) fName
    {

        short j1;

        fName= [NSString stringWithFormat:@"/%@",  fName];

        [self NewCase];

        NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *docDirectory = [arrayPaths objectAtIndex:0];

        NSString *filePath = [docDirectory stringByAppendingString:fName];
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];

        if (!fileExists) return;

        NSString *fileContents = [NSString stringWithContentsOfFile:filePath
                                                           encoding:NSUTF8StringEncoding error:nil];


        NSArray *chunks = [fileContents componentsSeparatedByString: @"#"];


      for (i = 0; i <= 100; i++)
         {
            InputV[i] = [[chunks objectAtIndex: i+5] doubleValue];
         }


    ...    
      for (j1 = 0; j1 <= 10; j1++)
        {

            GroupMode[j1] = [[chunks objectAtIndex: 206+j1]   retain];   
        }


     ...
}

そして、私が持っているどこかのinitメソッドで:

for (j1 = 0; j1 <= 10; j1++)
     {
           GroupMode[j1] = [[NSString alloc] initWithFormat:@""];
     }

InstrumentはNSAraay*branchsラインコードを指していますが、何が問題なのかわかりません。ある時点でリリースする必要がありますか?

助けていただければ幸いです。

4

3 に答える 3

2

コメントの中で、リリースを呼び出すことができると述べています。したがって、あなたはARCを使用しておらず、iphoneでタグ付けされていることに気付いたので、GCを使用していません。これにより、手動のメモリ管理が残ります。

問題は、チャンク配列またはそれらが保持しているチャンクのいずれかが過剰に保持されている(またはリリースされていない)ことであるようです。すべてのコードを表示しているわけではないので、言うのは難しいです。

表示しなかったコードのどこかにそれらのいずれかを保持しないようにしてください。たぶん、loadPlanメソッドの実装の残りの部分を見せてください。

編集:コードを追加したので、この回答を拡張することもできます。

この質問に答えてください:リリースと一致するチャンクへのretain呼び出しはどこにありますか?

また、GroupModeの宣言は何ですか?単なるポインタの配列のようです。その場合は、新しい値を設定する前に、おそらく古い値を解放する必要があります。

于 2012-08-09T13:13:01.357 に答える
1

あなたが投稿した内容に基づいて、別の答えを試してみましょう。

GroupModeはあるクラスのインスタンス変数であり、次のように宣言されていると想定しています。

NSString * GroupMode [11];

loadPlanの2番目のループは次のようになります。

  for (j1 = 0; j1 <= 10; j1++)
    {
        NSString* aChunk = [chunks objectAtIndex: 206+j1];
        if ( GroupMode[j1] != aChunk ) {
            [GroupMode[j1] release];
            GroupMode[j1] = [aChunk retain];
        }   
    }

GroupModeの要素を変更するたびに同様のことを行う必要があり、そのクラスのdeallocメソッドですべてのGroupMode保持オブジェクトを解放する必要があります。

ただし、プレーンアレイを使用せず、代わりにNSArrayやNSMutableArrayの使用に切り替えることをお勧めします。

于 2012-08-09T14:15:42.383 に答える
0

この答えを見てください:

"componentsSeparatedByString"メモリリーク

問題はおそらく、結果を使用している何かがチャンクからのものを過剰に保持していることです。この行はメモリが最初に割り当てられた場所であるため、Instrumentsはこの行を指していますが、問題の原因ではない可能性があります。

于 2012-08-09T12:52:53.387 に答える