2011-11-07 24 views
7

私は2GBほどのビデオファイルを持っています。このビデオファイルのヘッダーは暗号化されています(約528バイトが暗号化されています)。このビデオファイルを復号化するために、ファイルからNSDataオブジェクトにすべてのバイトを読み込んでいます。 NSDataオブジェクトにこのファイルを書き込むとすぐに、アプリケーションがクラッシュします(おそらくiPad用のb'coz max-256MB RAM)。大量のデータをNSDataオブジェクトに書き込む-iOS

このNSDataオブジェクトをiPad/iPhoneの仮想メモリに一時的に保存するにはどうすればよいですか?

私は同じことを達成することができる任意の他のアプローチですか?

答えて

11

NSInputStreamを使用すると、1つずつファイルを読み込み、一度にすべてをメモリにロードしないようにすることができます。具体的には、hasBytesAvailableread: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オブジェクトを作成する必要がない場合があります。あなたはそれを使用していると言いましたので、私はそれを投げました。

+0

[mystream hasBytesAvailable]は常にブール値を与えません。 –

+0

ファイルのサイズは約300MBです。ファイルへのパスも正しいです。 –

+0

私の答えに '[myStream open];という行を追加しました。これが適切に機能するには、これは非常に重要です。また、ストリーム終了時に '[myStream close];を呼び出す必要があります。 – Sam

関連する問題