0

この投稿をご覧いただきありがとうございます。お役に立てれば幸いです。私はいくつかの目的の c を実行しており、目的の c のメモリ管理の方法について学びました。たとえば、オブジェクトを所有するときは常に release を呼び出すようにし、いつ autorelease を呼び出すかなどです。また、ARC や私は自分のメモリを管理するのが好きなので、GC を新たに導入しました。後で iOS 開発に進む予定であり、自分のメモリを管理することは良い習慣であることを知っています。しかし、私がレンガの壁にぶつかったように見える小さな詳細がまだ 1 つあります。それは、オブジェクトに -retain メッセージを送信することに関係しています。-retain メッセージを送信すると参照カウントが 1 増えることを知りました。しかし、これは -retain を送信する適切なタイミングでしょうか? :

      - (void) setName : (NSString* ) theName 
      {
          // name is an instance variable of type NSString
          [theName retain]; // Must release this
          name = [theName copy]; // Must release this in dealloc
          [theName release]; // decrement the reference count because of retain
      }

ここで保持を呼び出して、引数を一時的に所有し、それを使用する前に何らかの形で解放されないようにする必要がありますか?

どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

4

いいえ。メソッドに引数として提供されたオブジェクトは、通常、メソッドが戻るまで存在します。そこで保持メッセージは必要ありません。ここに文字列をコピーして、メソッドが戻った後も保持します。

これは、このページの Apple のドキュメントの「使用しているオブジェクトの割り当て解除を回避する」セクションに記載されています。具体的には:

Cocoa の所有権ポリシーでは、受信したオブジェクトは通常、呼び出しメソッドのスコープ全体で有効である必要があると指定されています。受信したオブジェクトが解放されることを恐れずに、現在のスコープからオブジェクトを返すことも可能でなければなりません。オブジェクトの getter メソッドがキャッシュされたインスタンス変数または計算された値を返すことは、アプリケーションにとって重要ではありません。重要なのは、オブジェクトが必要な間有効なままであるということです。

余談ですが、ARCの使用を検討する必要があります。自分の記憶を管理するのは良い習慣ではありません。自分のメモリをどれだけうまく管理できても、LLVM コンパイラの方が優れています。自分の記憶を管理すると、自分だけが原因でトラブルシューティングが困難な問題につながります。これは、実際に対処する必要のない余分なレベルの認知負荷であり、最終的に手動のメモリ管理を手放すと、そこにあることすら知らなかったすべての精神的オーバーヘッドに安堵のため息をつくでしょう.

于 2012-11-17T15:06:26.850 に答える