2

iPhone アプリケーションの開発が終わりに近づき、iPhone 用に開発するときに autorelease を使用することがどれほど悪いことなのか疑問に思っています。かなりランダムなクラッシュに直面していますが、これまでのところ、ずさんなメモリ使用量以外の原因を突き止めることはできません。

Cocoa の初心者として、iPhone の手動保持/解放を支持して自動解放を避けることを強く提案したガイドライン文書を最初に読んだことを覚えています。しかし、より「上級」の Cocoa 開発者が早い段階で参加し (皮肉なことに、その後解雇されました)、あちこちで autorelease を使用していました。確かに、私は「モンキー・シー・モンキー・ドゥ」モードに陥り、それが戻ってきて私を悩ませているようです (現在、私はプロジェクトの唯一の開発者です)。

次に何をすべきか?コードを分岐し、可能な場合は自動解放コードを調べて置換する必要があるように思えますが、うっかりしてアプリを壊さないように注意してください。多くのライブラリ呼び出しの結果、stringWithFormat のような自動解放されたオブジェクトが生成され、alloc を使用していないほとんどすべてのオブジェクトが生成されるようです。私が注目すべき他の落とし穴や提案はありますか?ココアの達人に感謝します。

4

6 に答える 6

12

autorelease の代わりに release を使用すると、狭い場所でのメモリ使用量を改善できます (これは iPhone では良いことです)。何をすべきかまだ少しぼんやりしている場合は、Obj-C のメモリ管理に関するチュートリアルをいくつか読んでから、デバッガーとクラッシュ レポートを使用してそれらのクラッシュを追跡し、オブジェクトを解放しすぎている場所を見つけます。 . これこれは、開始するのに適した 2 つの場所です。

于 2009-01-09T20:14:54.380 に答える
4

自動解除または手動解除の選択よりも重要なのは、あなたallocdeallocあなたNSAutoreleasePoolの s の頻度です。ほとんどの Cocoa フレームワークはautorelease自由に使用するため、適切なプール ドレイン戦略が必要です。それが整ったら、するかどうかの選択はreleaseそれほどautorelease問題ではなくなります。

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

于 2009-01-10T10:39:12.607 に答える
2

自動リリースの使い方がわからないと思われる場合は、iTunesUでCS193pFALL2010をチェックしてください->講義番号4。

それはあなたにメモリ管理とものについてすべてを教えます(最初の10分かそこらをスキップした場合)

于 2010-11-20T05:10:26.367 に答える
0

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

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

于 2012-11-08T07:28:49.073 に答える
0

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

于 2009-01-09T20:47:51.893 に答える
0

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

于 2010-01-27T03:24:33.797 に答える