2011-06-20 8 views
1

は私がNSFileManager漏れ

NSFileManager *fileManager=[[NSFileManager alloc] init]; 
fileList=[[fileManager contentsOfDirectoryAtPath:DOCUMENTS_FOLDER error:nil] retain]; 
[fileManager release]; 
を書いた次のコードスニペットでメモリリークを発見し

リーク情報 -

[NSFileManager contentsOfDirectoryAtPath:error:] 
[NSFileManager directoryContentsAtPath:matchingExtension:options:keepExtension:error] 
CFStringCreateWithBytes 
_CFStringCreateImmutableFunnel3 
_CFRuntimeCreateInstance. 

そして、私はそれを解決する方法がわかりませんか?

+0

後で 'fileList'をリリースしていますか? –

答えて

4

ファイルマネージャのalloc-then-releaseは問題ありません。しかし、

fileList=[[fileManager contentsOfDirectoryAtPath:DOCUMENTS_FOLDER error:nil] retain];

これで配列が保持されました。後でそれを解放する必要があります。そうしないと、漏れがあります。

2

メモリ管理のための親指のルールは単純です:すべてのallocretaincopy、またはnewについては

は、対応するreleaseまたはautoreleaseを持っている必要があります。

あなたはここに保持呼んでいる:

fileList=[[fileManager contentsOfDirectoryAtPath:DOCUMENTS_FOLDER error:nil] retain]; 

が、あなたはそれを解放しません。

+0

このコードをオーバーライドする場合は、fileList = [fileManager contentsOfDirecotryAtPath:DOCUMENT_FOLDER error:nil];これはリークです。 – scofield

+0

@scofield:同じように。後でそれを保持またはコピーしてからリリースしないといけません。 InstrumentsのLeaksテンプレート(特にオブジェクト履歴機能)を使用して、漏洩しているものとその方法を確認してください。 –