2010-12-17 7 views
1

まず、これを知らないため、事前にお詫び申し上げます。私は、この例では、メモリ管理を扱う最善の方法について頭を下ろそうとしています。リリースメッセージに達しない場合はNSFileManagerを解放してください

私は、ファイルをリストに追加する必要があるかどうかを判断する簡単な方法を持っています。チェックの1つはNSFileManagerをインスタンス化する必要があります。いくつかの小切手は潜在的に長い時間がかかる可能性があるので、私の条件のいずれかが失敗するとすぐに飛び降りたいと思います。しかし、私が早く戻ってくると、NSFileManagerインスタンスはリリースメッセージを受け取ることはありません。

私はAutoReleasePoolを使用することを考えましたが、現在の実行ループが終了するまでオートレリープールに追加されたオブジェクトはリリースされず、実行ループごとに数千ものファイルが表示されますすべてループの最後まで割り当てられます。

NSFileManagerの各インスタンスが適切に解放されるようにするにはどうすればよいですか。任意の提案が高く評価されました。

ありがとうございます!

 
- (BOOL) fileShouldBeAdded:(NSString *)filePath { 
BOOL fileShouldBeAdded = TRUE; 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 
if ([[filePath lastPathComponent] containsString:@"test.txt"]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
if (![fileManager xAttrFileAtPathShouldBeAdded:filePath]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
if ([[BackupManager sharedInstance] isExcludedByUser:filePath]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
if (![fileManager backupRequiredForPath:filePath]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
[fileManager release]; 
return fileShouldBeAdded; 
} 
+0

あなたはいつもメモリ内のFileManagerのインスタンスを保持しているので、自動リリースされたインスタンスを使用するかどうかには違いはありません。自動リリースされたインスタンスは本当にここであなたが望むものです。 –

答えて

3

メモリを外部メソッドで管理する関数をリファクタリングします。あなたのループ全体でその同じインスタンスを使用して、その後と - インスタンス変数として、言う - あなたはこれが何千回も呼ばれていると言うので

-(BOOL) checkFile: (NSFileManager*) fileManager withPath:(NSString *)filePath 
{ 
if ([[filePath lastPathComponent] containsString:@"test.txt"]) { 
    return FALSE; 
} 
if (![fileManager xAttrFileAtPathShouldBeAdded:filePath]) { 
    return FALSE; 
} 
if ([[BackupManager sharedInstance] isExcludedByUser:filePath]) { 
    return FALSE; 
} 
if (![fileManager backupRequiredForPath:filePath]) { 
    return FALSE; 
} 
} 

- (BOOL) fileShouldBeAdded:(NSString *)filePath { 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 

BOOL fileShouldBeAdded = [self checkFile:fileManager withPath:filePath]; 
[fileManager release]; 
return fileShouldBeAdded; 
} 
+0

一方向ですが、より良い解決策は、割り当てトラフィックを完全に回避することです。 – bbum

+0

True - ループの前にfileManagerを割り当てて、これらの関数にパラメータとして渡すことができます。まず問題を解く方法を示したかったのです – Mark

2

は、あなたはループのNSFileManager外を割り当てるオフにはるかに優れています。

あなたが望むなら、あなたはそれをマークの解決策の引数として渡すことができます。

一時的な割り当てトラフィックは、パフォーマンスに非常に有害な可能性があります。しかし、もちろん、それは非常に便利でないか、問題を測定していなければ気にしないでください。

関連する問題