1

Приложение Я работаю над использованием ARC. Я хотел, чтобы он обрабатывал большие файлы, поэтому вместо загрузки файлов в целом я загружаю куски данных с использованием метода NSFileHandle readDataOfLength. Это происходит внутри цикла, который повторяется, пока весь файл не будет обработан:Огромный объем памяти с ARC

- (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; 

     ... 

    } 

    ... 

} 

Согласно профайлеру, нет утечек памяти; однако мое приложение ест много памяти, когда обрабатывает файл. Мое предположение - автореферат приходит только после обработки файла. Могу ли я исправить это, не переключаясь на ручное управление памятью?

+0

Пожалуйста, размещайте код, относящийся к вашей проблеме –

+0

рассмотрите возможность использования 'mmap' – mvds

+0

@AshleyMills done –

ответ

8

Оберните код в пределах этого цикла с помощью пула автоопределения.

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

readDataOfLength Retuns autoreleased данных и так как вы застрять внутри этого цикла, и для этого его метод, который autoreleased данные, которые не получают выпущенные до вашего цикла и метод инкапсулирующий делается.

+0

Если мой предложенный метод не работает для вас (по причинам, о которых я не подозреваю, поскольку пометка конкретных файлов реализации, которые должны быть исключены из ARC, является стандартной функцией), рассмотрите возможность использования другого метода чтения данных - например, CoreFoundations 'CFReadStreamRead'. – Till

+0

«тегирование определенных файлов реализации, которые должны быть исключены из ARC, является стандартной функцией», похоже, что мой ответ прямо там. На самом деле я этого не знал. Благодаря! –

+0

Также посмотрите на это: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on- ios-and-mac-os-x/ – Till