NSAutoreleasePoolにアイテムを追加する方法と、後でプールを排水する方法を理解しています。しかし、私の教育に欠けているのは、いつ、どこでこれをやるべきかということです。いつ、どこでNSAutoreleasePoolを排除すべきですか?
明らかに、メインでそれをやっているだけでは意味がありません。なぜなら、決してメモリを解放しないことと変わらないからです。しかし、私がこれまでに読んだドキュメントは、これに関する他のガイダンスを私に提供していません。
NSAutoreleasePoolにアイテムを追加する方法と、後でプールを排水する方法を理解しています。しかし、私の教育に欠けているのは、いつ、どこでこれをやるべきかということです。いつ、どこでNSAutoreleasePoolを排除すべきですか?
明らかに、メインでそれをやっているだけでは意味がありません。なぜなら、決してメモリを解放しないことと変わらないからです。しかし、私がこれまでに読んだドキュメントは、これに関する他のガイダンスを私に提供していません。
main
の自動解放プールは、自動解放プールが常に利用可能であるというアプリケーションの責任をCocoaに果たします。このプールは、メインイベントループのすべてのサイクルで排水されます。
さらに、作成する各NSThread
には、独自の自動解放プールが必要です。
これ以外にも、メインの自動解放プールが排水される前に作成する自動解放オブジェクトの数を見積もるという問題にすぎません。インストゥルメントを使用して、自動解放プールがどこで使用されるかについてのさらなる証拠としてピークメモリフットプリントを調べることもできます。
ありがとうございます。プール全体はまだ私にとって奇妙に見えますが、少なくとも今私はそれを信頼できると感じています。 –
NSAutoreleasePoolオブジェクトを手動で管理する必要があるのは、スレッドで実行しているときだけです。スレッドが多くのメモリを使用していない場合は、最初はドレインし、最後をドレインします。さもなければ、非常に多くのループ反復をなくしてください。プールを排水する間の反復回数は、プールで使用しているメモリの量によって異なります。より多くの場合、より効率的なメモリ使用量を減らすことができます。
数万のパーティクルを持つパーティクルシステムの場合は、&を割り当てずに、常にメモリを解放する方が良いですが、代わりに1回割り当ててリングバッファなどを使用する方がよいでしょう。
自動解放されたオブジェクトをループ内に割り当てるときに、自動解放プールを使用すると、下層の自動解放プールのメモリ消費のピークが減少します。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html
ポストで自動解放プールに
詳細情報いくつかのコードと私たちはあなたの指針を与えることができます。オートリリープールをどこで使用していますか?どのような目的のために?その他 – MishieMoo
本当に「どこでXをやるべきですか?」という質問に答えましたか? 「Xはどこでやってるの?」 –