2

私が取り組んでいるアプリはARCを使用しています。大きなファイルを処理したかったので、ファイル全体をロードする代わりに、NSFileHandle readDataOfLength メソッドを使用してデータのチャンクをロードしています。ファイル全体が処理されるまで繰り返されるループ内で発生しています。

- (NSString*)doStuff { // called with NSInvocationOperation

    // now we open the file itself

    NSFileHandle *fileHandle =
    [NSFileHandle fileHandleForReadingFromURL:self.path
                                        error:nil];

    ...

    BOOL done = NO;
    while(!done) {

        NSData *fileData = [fileHandle readDataOfLength: CHUNK_SIZE];

        ...

        if ( [fileData length] == 0 ) done = YES;

        ...

    }

    ...

}

プロファイラによると、メモリ リークはありません。ただし、私のアプリはファイルの処理中に大量のメモリを消費します。私の推測では、自動解放はファイルを処理した後にのみ行われます。手動メモリ管理に切り替えずに修正できますか?

4

1 に答える 1

9

自動解放プールを使用して、そのループ内にコードをラップします。

while(!done) 
{
    @autoreleasepool
    {
        NSData *fileData = [fileHandle readDataOfLength: CHUNK_SIZE];
        ...
        if ( [fileData length] == 0 ) 
        {
            done = YES;
        }
        ...                
    }
};

readDataOfLength自動解放されたデータを返します。そのループとそのメソッドの内部に固執するため、ループとカプセル化メソッドが完了するまで自動解放されたデータは解放されません。

于 2012-06-12T00:47:48.017 に答える