1

ファイルから大量の文字を NSString に割り当てたい。私はそれをしました。iOSシミュレーターで問題なく動作しています。しかし、iOS デバイスではクラッシュしました。長さが NSString メモリを超えていると思います。NSString の制限は、デバイスや使用可能なメモリによって変わることがわかります。私の質問は、ファイルから文字列を取得し、メモリの問題なしでランタイムに保存する代替手段はありますか?. または NSString の使用可能な長さを確認する方法は?

ここに私のコード。解析された文字列を NSString に追加しています

 Str=[Str stringByAppendingString:TmpStr];  
4

3 に答える 3

2

実際にメモリの問題であることを確認し、メモリ不足の状態を処理することをお勧めします。その方法については、この SO の投稿を参照してください: iPhone - メモリ不足の状態に対処する方法

書籍のコンテンツを一度に NSString にロードしようとすると、メモリに制約のあるデバイスでメモリ不足の状態になる可能性があります。ストリームを使用すると、ファイルを一度に部分的に読み取り、ファイルの現在の部分のみをメモリに保持できます。一部の書籍を完全に正常に読み込むことができたとしても、速度は遅くなり、アプリが必要とするよりもはるかに多くのメモリを消費します。これにより、メモリ不足の状態で最初にフラグが立てられるアプリの 1 つになります。

チェックアウトApple のストリーム プログラミング ガイド

そのガイドから:

Cocoa には、NSStream、NSInputStream、および NSOutputStream という 3 つのストリーム関連のクラスが含まれています。NSStream は、すべてのストリーム オブジェクトの基本的なインターフェイスとプロパティを定義する抽象クラスです。NSInputStream と NSOutputStream は NSStream のサブクラスであり、デフォルトの入力ストリームと出力ストリームの動作を実装します。メモリ内にあるか、ファイルまたは C バッファに書き込まれたストリーム データの NSOutputStream インスタンスを作成できます。NSData オブジェクトまたはファイルから読み取ったストリーム データの NSInputStream インスタンスを作成できます。

編集:コメントで、XMLからロードしていることを明確にしました。あなたはまだ同じ基本的な問題を抱えています.一度に何らかの「本」の大きなコンテンツをメモリにロードしようとしています. XMLを解析するときにtmp文字列を追加しているため、効果は同じです。そのため、ブックの必要な部分を段階的にロードする方法を見つける必要があります。幸いなことに、ストリームを使用するように NSXMLParser に指示できます。

これは役立つかもしれません: Using NSXMLParser initWithStream: no parser delegate methods received

また、役立つ可能性のあるトピックに関するこの SO 投稿も見つけました: Objective-C: Reading a file line by line

アプリの詳細についてはわかりませんが、必要な現在のデータ (および両側の数ページ) までストリーミングすることも、コンテンツをストリーミングしてディスク上のいくつかの一時ファイルの「ページ」に分割することもできます。 「ページキャッシュ」の。

于 2012-11-27T13:09:25.550 に答える
0

アプリがクラッシュしたときにコンソールログを共有していただけませんか?それは本当の問題ではないと思いますが、問題は少し異なります。その間、データベースをストレージに使用して試すことができます。また、可能であれば、文字列を割り当てようとしている行を表示してください。

于 2012-11-27T12:52:48.223 に答える
0

NSString の代わりに NSMutableString を使用します。それはあなたを助けるかもしれません!

于 2012-11-27T13:27:01.007 に答える