5

現在、「iPhone OS のメモリ管理」という氷水に飛び込んでいます。

これが私が学んだ1つのルールです:

メソッドに alloc が表示されるたびに、メソッドの下部にある対応する変数を解放します。

コピーまたは保持を示すヘッダー ファイルに @property(...) を作成するたびに、その変数の解放メッセージを dealloc メソッドに入れます。

IBOutlet があるたびに、同じことを行います。唯一の例外: IBOutlet に @property(... assign) のようなものがある場合、つまり、assign キーワードがある場合。それから私は dealloc メソッドでそれを解放することを気にしません。

知っておくべき良いルールがもっとたくさんあると思います!あなたが持っているものを書き留めてください。それらをすべて一緒にこすり取りましょう。優れた説明へのリンクも歓迎します。

4

4 に答える 4

4

実際には、オブジェクトを初期化し、メソッド名に「init」が含まれている場合はいつでも、それを解放する責任があります。「init」という単語を含まない Class メソッドを使用してオブジェクトを作成する場合は、そうしません。

例えば:

  NSString *person = [NSString stringWithFormat:"My name is %@", name];

リリースは必要ありません。しかし:

  Person *person = [[Person alloc] init];

リリースが必要です(質問で述べたように)。同じく:

  Person *person = [[Person alloc] initWithName:@"Matt"]];

リリースも必要です。

これは規約であり、言語の規則ではありませんが、Apple が提供するすべての API に当てはまることがわかります。

于 2009-04-24T16:17:31.540 に答える
4

私が使っているルール

  • 名前が「alloc」または「new」で始まるか、「copy」を含むメソッドを使用して、作成したすべてのオブジェクトを解放します。

  • 保持しているすべてのオブジェクトを解放します。

  • +className 簡易コンストラクタを使用して作成されたオブジェクトを解放しないでください。(クラスはそれを作成し、それを解放する責任があります。)

  • 他の方法で受け取ったオブジェクトを解放しないでください。例: mySprockets = [ウィジェット スプロケット];

  • 受け取ったオブジェクトをインスタンス変数に格納する場合は、それを保持するかコピーしてください。(弱い参照でない限り、通常は循環参照を避けるために、別のオブジェクトへの単なるポインタです。)

  • 受信したオブジェクトは、(一般に) 受信したメソッド内で有効であり、呼び出し元に戻された場合も有効です。

いくつかの良いリンク:

  1. http://www.gehacktes.net/2009/02/iphone-programming-part-2-objective-c-memory-management/
  2. http://mauvilasoftware.com/iphone_software_development/2008/01/iphone-memory-management-a-bri.html
于 2009-04-25T05:35:20.420 に答える
2

メモリ管理は、無害に見えるすべてのコード行から segfaults が発生するのを見ると気が遠くなるように思えるかもしれませんが、コツをつかめば実際には非常に簡単です。このページを読んでからApple のドキュメントを読むと、すぐにバグのないコードを書くことができます。

于 2009-04-24T21:04:33.610 に答える
1

私は、クラスメソッドを使用するか、作成直後に自動リリースすることによって、自動リリースされたオブジェクトのみを作成する傾向があります。ただし、そうしない理由を述べることができない場合を除きます。例えば:

  • しばらく保持するつもりなので、メンバー変数に割り当てています。
  • 別のメソッドにすぐに渡すために作成しているだけで、そのメソッド呼び出しの直後にリリースメッセージを送信します。
  • パフォーマンス上の理由から、ループ内に多数のオブジェクトを作成したり、オブジェクトが大量のデータ(画像など)を保持したりするなど、最も近いNSAutoreleasePoolが解放される前にそのメモリを解放する必要があります。

そうすれば、オブジェクトが漏れる可能性が低くなります。デフォルトでは、自動リリースを作成しますが、自動リリースしないという意図的な決定を行うと、すぐにどこでリリースされるかという問題に直面します。

オブジェクトのプロパティについては、deallocメソッドで解放するのではなく、nilを割り当てるのが好きです。そうすれば、保持またはコピーされたプロパティにリリースが送信され、割り当てられたプロパティは単純に上書きされます。プロパティを保持に変更したり、保持から変更したりしても、deallocメソッドを更新する必要はありません。

于 2009-04-24T16:43:25.203 に答える