質問

iPhoneアプリケーションの開発が終わりに近づいてきましたが、iPhone用に開発するときに自動リリースを使用するのはどれほど悪いのでしょうか。私はいくつかのかなりランダムなクラッシュに直面していますが、これまでのところ、私はそれをずさんなメモリ使用以外に特定することはできません。

Cocoaの初心者として、iPhoneの手動保持/リリースを優先して自動リリースを回避することを強く推奨するガイドラインドキュメントを最初に読んだことを覚えています。しかし、もっと「上級」のCocoa開発者が早い段階で参加しました(皮肉なことにそれを手放しました)。確かに、私は「monkey see monkey do」に行きました。モード、そしてそれは私を悩ませるように戻ってきているようです(私は今プロジェクトで唯一の開発者です)。

では、次に何をすべきか?コードを分岐させて、可能な限り自動リリースコードを置き換えて置き換えなければならないように思えます。多くのライブラリ呼び出しは、stringWithFormatのような自動リリースされたオブジェクトや、私が自分でallocを使用していないほとんどすべてのものをもたらすようです。私が探している他のゴッチャや提案はありますか?ありがとう、ココアの達人。

役に立ちましたか?

解決

autoreleaseの代わりにreleaseを使用すると、狭い場所でのメモリ使用量を改善できます(iPhoneで適切です)が、retain / releaseルールに従わない場合、クラッシュはまったく役に立ちません。あなたがすべきことについてまだ少し曖昧な場合は、Obj-Cのメモリ管理に関するいくつかのチュートリアルを読んでから、デバッガとクラッシュレポートを使用してクラッシュを追跡し、オブジェクトを解放しすぎている場所を見つけます。 これおよびこれは、開始するのに適した2つの場所です。

他のヒント

自動リリースまたは手動リリースの選択よりも重要なのは、 NSAutoreleasePool alloc および dealloc する頻度です。ほとんどのCocoaフレームワークは autorelease を多用しているため、適切なプールドレイン戦略が必要です。それができたら、 release autorelease のどちらを選択するかは、それほど問題になりません。

そうは言っても、心配する必要があるのはタイトなループだけです。最良の結果を得るには、数回の反復ごとに NSAutoreleasePool を割り当ててリリースします。また、Runloopを持たない別の NSThread を生成した場合は、プールを作成して、頻繁にアイドルになるようにします。ほとんどのアプリケーションはイベントごとに少量のデータしか割り当てないため、イベントがディスパッチされる前にプールを割り当て、ディスパッチが戻った後に解放するという UIKit の戦略は非常にうまく機能します。

自動リリースの使用方法がわからないと思われる場合は、iTunes UでCS193p FALL 2010をご覧ください->講義番号4。

メモリ管理などに関するすべてのことを教えます(最初の10分程度スキップした場合)

iPhoneのパフォーマンス上の理由から、Appleは可能な限り自動リリースされたオブジェクトを使用しないことをお勧めします。代わりに、オブジェクトの使用が終了したら、オブジェクトを明示的に解放してください。

自動解放プールを使用するということは、未使用のメモリが残っている可能性があることを意味します。 iPhoneのメモリは少ないため、自動解放を待機している間にリソースを占有するのではなく、不要なメモリをできるだけ早く解放するとパフォーマンスが向上する可能性があります。

自動リリースの場合、基本的には「これはもう必要ありませんが、(自動リリースプールが空になる前に)誰でも自由に拾うことができます」と言っています。あなたが言っているオブジェクトを明示的に解放するとき:"これはもう必要ありません。他の誰かが既に別の言い方をしていない限り(取得済み)、すぐに割り当てを解除する必要があります。"

その結果、通常、自動解放は間違ったことではありません。メッセージの送信者にオブジェクトを渡して、送信者がオブジェクトを解放する必要がない場合に必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top