1

マネージドメモリの世界から来て、ARCを使用するときにオブジェクトをクリーンアップする適切な方法は何でしょうか。

例:C#でインスタンス変数を宣言する場合、.NETは、スコープ(メソッド/ループ本体など)を離れると、GCがインスタンス変数を取得できるようにします。

Objective-Cでクリーンアップする適切な方法は何ですか?参照/ポインターをnilに設定するか、deallocを呼び出すだけです。そうしないと、実行がスコープを離れてジョブを実行すると、ARCはインスタンスを指している外部参照がないことを検出しますか?

4

3 に答える 3

1

ARCは「自動参照カウント」を意味し、コンパイラにretain//への呼び出しを追加させるための単なる方法です。これはGCと同じではありませんが、ほとんどの場合、GCのように、オブジェクトの存続期間が自動的に管理されると考えることができます。releaseautorelease

詳細については、 ARCのLLVMドキュメントをお読みください。

最後の注意:自分自身を呼び出さないでdeallocくださいdeallocはオブジェクトのファイナライザーであり、ObjCランタイムがオブジェクト参照カウントが0に達したと判断すると呼び出されます。このメソッドは、サブクラスによってオーバーライドされることのみを目的としています。ARCモードでは、オブジェクト自体がファイナライズされた後にファイナライズする必要がある非オブジェクトivarをオブジェクトが参照している場合を除いて、通常はこれを行う必要はありません。

于 2012-09-06T18:34:27.627 に答える
1

実行がスコープを離れると、ARCは外部参照がインスタンスを指していないことを検出し、あなたのために仕事をしますか

基本的に、はい、それがまさに ARC が行うことです。ARC を使用している場合、オブジェクトをクリーンアップする必要はありません。実際、できません (手動でメモリ管理を実行しようとするのを止めてしまいます)。

私の本の関連する議論を参照したいかもしれません:

http://www.apeth.com/iOSBook/ch12.html#_memory_management

舞台裏で実際に何が起こっているか (メモリが実際にどのように管理されているか) を説明し、続いて ARC がそれらのほとんどからどのように保護されているかを説明します。

(上記の URL で説明したように) ほとんどの場合、ガベージ コレクションのようなものではなく、目に見えない明示的なメモリ管理をコード全体に挿入することによって行われます。

于 2012-09-06T18:30:24.093 に答える
0

以前は、iOS プログラマーは、オブジェクトに解放メッセージを送信して、割り当てたオブジェクトの使用が終了したことをシステムに通知する責任がありました。これは、手動参照カウントとして知られるメモリ管理システムに従って行われました。Xcode 4.2 の時点で、プログラマーはこれについて心配する必要がなくなり、必要に応じてシステムがメモリを解放することに頼ることができます。これは、自動参照カウント (略して ARC) と呼ばれるメカニズムによって行われます。Xcode 4.2 以降を使用して新しいアプリケーションをコンパイルすると、デフォルトで ARC が有効になります。

Xcode インターフェイスで ARC を無効にすることもできます。メイン プロジェクト (main.h ではない) に移動し、実際の Xcode プロジェクトを選択します。プロジェクトの設定を表示する Xcode のウィンドウが表示されます。それは「Objective-C Automatic Reference Counting」と表示され、「Yes」に設定され、非アクティブ化 (「No」) されます。データ管理とメモリの世界から来ている場合は、ARC について心配する必要はありません。あなたが言ったが、iOS の新機能システムに更新し続ける方が簡単だということを心に留めておいてください。

そして今、ARC を使用した「Xcode でクリーンアップする適切な方法」は、「alloc」と「init」を使用することです。

Xcode の ARC を使用すると、現在 Xcode の仕事である「クリーニング」を心配する必要はありません。必要なのは次のことだけです。

1) 変数を作成します。

2) 割り当てます。

3) 初期化します。

それでおしまい。

ここでの例:

int main (int argc, char * argv[])
{
   @autoreleasepool {
      Variable  *myVariable;

      // Create an instance of a Variable and initialize it

      myVariable = [Variable alloc];
      myVariable = [myVariable init];

      // Set variable to 4/20

      [myVariable setNumerator: 4];
      [myVariable setDenominator: 20];

      // Display the variable using the print method

      NSLog (@"The value of myVariable is:");
      [myVariable print];
   }

   return 0;
}

割り当ててから初期化するだけで、他に何もする必要はありません。

ゲッターとセッターに注意してください。

于 2012-09-06T21:32:52.143 に答える