#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 у вас это сработало? Если да, я был бы признателен, если бы вы отметили это как ответ. В противном случае расскажите подробнее о том, что происходит.