0

以下のコードは、プロファイリング時にメモリ リークを示します。

ContentViewController *dataViewController;
dataViewController = [[ContentViewController alloc]initWithNibName:@"ContentViewController" bundle:nil];

dataViewController.DocumentPath = [self.modelArray objectAtIndex:index];
return dataViewController;

どうすればこのリークを解決できますか、どんなアイデアでも助けてください。

4

2 に答える 2

4

ARC を使用していない場合。

メソッドからオブジェクトを返すたびに、自動解放されたオブジェクトを返します。

return [dataViewController autorelease];

ARC を使用することをお勧めします。手動のメモリ管理よりもはるかに優れているためです。ARC はコンパイル時の機能であり、ソース コードをコンパイルするときに自動的に保持、解放の呼び出しを追加します。

于 2013-01-14T09:22:04.840 に答える
1

このコードがARCの下でリークするとは思わないので、質問者がARCではなく手動のメモリ管理を使用していると想定しても安全だと思います。

そうは言っても、ミドゥン議員の答えは正しいです。当面の問題を解決するには、返されたオブジェクトを自動解放する必要があります。しかし、なぜこれがプロファイリング ツールによってリークと見なされるのかについて、いくつかの情報を追加したいと思いました。

Objective-C は、メソッドの命名規則を使用して、メソッドのメモリ管理セマンティクスを確認します。たとえば、という名前のメソッドnewPersonは、オブジェクト (保持カウントが +1 のオブジェクト) への所有参照を返すことが期待されます。という名前のメソッドpersonは、自動解放されたオブジェクト (つまり、所有参照のないオブジェクト) を返すことが期待されます。

最初のケースでは、メソッドの呼び出し元がオブジェクトを所有し、終了時にそれを解放することが期待されます。2 番目のケースは、呼び出し元がオブジェクトの解放について心配する必要がないことを示しています (オブジェクトは所有されていないため)。

規則を覚えるために私が好んで使用する簡単な方法は、CARN ルールとして学んだことです。

  • コピー_
  • 割り当て_
  • 保持_
  • 新しい_

これらの単語を含むすべてのメソッドは、Cbjective-C では、返されたオブジェクトへの所有参照を返すことが期待されます。

結論として、所有しているオブジェクトをメソッドから返す場合は、その名前を修正して上記の単語のいずれかを含めるか、そうでない場合は、返されたオブジェクトを自動解放します。

于 2013-01-14T09:58:41.333 に答える