Запись огромных объемов данных в объекты NSData-iOS

#iphone #objective-c #ios #memory-management

#iPhone #objective-c #iOS #управление памятью

Вопрос:

У меня есть видеофайл размером около 2 ГБ. Этот заголовок видеофайла зашифрован (зашифровано приблизительно 528 байт). Чтобы расшифровать этот видеофайл, я считываю все байты из файла в объект NSData. Как только я записываю этот файл в объект NSData, происходит сбой моего приложения (возможно, из-за максимальной оперативной памяти 256 МБ для iPad).

Итак, как мне временно сохранить этот объект NSData в виртуальной памяти iPad / iPhone?

Любой другой подход, с помощью которого я могу добиться того же?

Ответ №1:

Используйте NSInputStream для чтения файла по частям, чтобы не загружать все это в память сразу. В частности, вы захотите использовать hasBytesAvailable и read:maxLength: .

Что-то вроде:

 NSInputStream *myStream = [NSInputStream inputStreamWithFilAtPath:pathToAbsurdlyLargeFile];
[myStream open];
Byte buffer[BUFFER_SIZE];
while ([myStream hasBytesAvailable])
{
   int bytesRead = [myStream read:buffer maxLength:BUFFER_SIZE];
   NSData *myData = [NSData dataWithBytes:buffer length:bytesRead];
   // do other stuff...
}
[myStream close];
  

Обратите внимание, что вам может не понадобиться создавать объект NSData. Вы только что упомянули, что используете его, поэтому я вставил его.

Комментарии:

1. [mystream hasBytesAvailable] всегда не выдает значения Bool.

2. Размер файла составляет около 300 МБ, указанный путь к файлу также правильный.

3. Добавлена строка [myStream open]; в моем ответе. Это критически важно для правильной работы. Вам также нужно будет вызвать [myStream close]; , когда вы закончите с потоком.

4. @Pranav у вас это сработало? Если да, я был бы признателен, если бы вы отметили это как ответ. В противном случае расскажите подробнее о том, что происходит.