1

NSXMLParser を使用して解析アルゴリズムを構築します。メモリ使用量を最小限に抑えるための最良の戦略は何かについて疑問があります。

私は valueObject (例えば "Person") を持っています。このオブジェクトには約 30 個の NSString プロパティがあります。これを確認したところ、一度にインスタンス化されたこれらの Person オブジェクトは 1 つだけです。ノードがトラバースされ、Person が「ビルド」されると、Person を NSMutableArray に渡し、この Person を解放します。そこは問題ないようです。(tableView には配列が必要です)。配列内の約 50 以上の Person オブジェクトに到達すると、アプリが終了しただけで、didReceiveMemoryWarning が呼び出されず、他の警告も parseErrorOccurred も何も表示されませんか?

xml で Persons の数を制限すると、アプリは問題なく動作しますが、Instruments でメモリ リークを見つけることができませんでした。配列に 50 個以上の Person オブジェクトを保持することはできないと思います...少し厳しいようですが、iPhone でのメモリの経験があまりないので、これは単なる推測です。

xml は検索結果であり、ユーザーはおそらく少数しか必要としないため、それらをコア モデルに永続化して表示用に保持するのは少しクレイジーに思えます。

これらの Person オブジェクトを保持するための適切な戦略は何でしょうか? それとも、iPhone はこれよりもはるかに多くを処理できるはずなので、巨大なメモリ リークを見逃しているのでしょうか?

経験豊富な開発者が私を正しい方向に向けてくれることを願っています:)

ありがとうございました!

4

4 に答える 4

4

NSXMLParserSAX ベースのパーサーであるにもかかわらず、入力ストリームの解析をサポートしていません。つまり、解析している XML 文字列全体がメモリに保持されます。これはそれ自体が大きな問題ですが、オブジェクトの XML から文字列データを複製し始めると、問題が悪化しますPerson

Person文字列が非常に大きい場合、一度にメモリ内に解析されるオブジェクトが多すぎるという 2 番目の問題があります。

AQXMLParser最初の問題は、Jim Dovey のAQToolkitライブラリを使用することで解決できます。このライブラリは、 にNSXMLParser似た API を提供しますが、ディスクからのデータのストリーミングをサポートします。

2 番目の問題は、Core Data、SQLite Persistent Objects などのディスク ベースの永続化テクノロジを使用するか、Person オブジェクトを自分でディスクに保存するだけで解決できます。

于 2009-11-04T13:29:41.523 に答える
1

それらの文字列の長さはどれくらいですか?一般に、iPhone 3G以前のモデルでは、アプリで最低約20 MBのメモリを使用できる必要があります(3Gではさらに多くのメモリが使用可能です)。もちろん、これは絶対的なルールではありませんが、まともな経験則です。50個のオブジェクトでこれだけのメモリを占有するということは、Personオブジェクトあたり最大400〜500KBを意味します。これは球場にありますか?その場合、おそらく、すべてのオブジェクトを同時にメモリに保持しないメモリ管理戦略が必要になります。その場合、CoreDataはおそらくあなたに大いに役立つでしょう。

于 2009-11-04T00:49:16.840 に答える
0

メモリ警告が表示されなかった場合、それが原因でアプリが終了することはおそらくありません。Xcode でオーガナイザーに移動し、デバイスを選択してから、コンソール タブをクリックします。アプリがメモリ上の理由でシャットダウンされた場合、コンソール ログに、メモリ不足のためにアプリを強制終了していることを示すシステム メッセージが表示されます。

于 2009-11-04T00:55:30.777 に答える
0

答えは、着信ストリームを切り刻むことです。私はそれについて少し前に投稿しました: https://lukassen.wordpress.com/2010/01/15/feeding-nsxmlparser-a-stream-of-xml/

于 2013-07-16T07:01:51.183 に答える