web-dev-qa-db-ja.com

目標C-割り当て、コピー、保持

Objective Cは初めてです。ポインターの概念を含め、Cの基本的な知識があります。 2つの基本的な質問があります。

  1. 誰かが、割り当て、コピー、保持の違いを何らかの類似性で説明できますか?
  2. ポインター変数を返す関数をどのように処理し、戻りポインターを介してメッセージングをどのように実行しますか?
79
Sabha B

変更されたドキュメントの更新された回答

この情報は、ドキュメント内のいくつかのガイドに広がっています。必要な読み物のリストは次のとおりです。

この質問に対する答えは、ARC管理アプリケーション(新しいプロジェクトの最新のデフォルト)を使用しているか、手動メモリ管理を強制しているかによって完全に異なります。

Assign vs. Weak-assignを使用して、プロパティのポインタをオブジェクトを保持またはキュレートせずにオブジェクトのアドレス。 weakを使用して、割り当てられたオブジェクトの割り当てが解除された場合、プロパティが自動的にnilを指すようにします。ほとんどの場合、weakを使用するので、割り当て解除されたオブジェクトにアクセスしようとはしません(メモリアドレスの不正アクセス-"EXC_BAD_ACCESS ")適切なクリーンアップを実行しない場合。

Retain vs.Copy-宣言されたプロパティはデフォルトでretainを使用します単に省略できます)、プロパティに別のオブジェクトが割り当てられているか、nilに設定されているかにかかわらず、オブジェクトの参照カウントを自動的に管理します。 copyを使用して、新しく割り当てられたオブジェクトに-copyメッセージ(渡されたオブジェクトのコピーを作成し、そのコピーを代わりにプロパティに割り当てます-割り当てられたオブジェクトが他のオブジェクトのプロパティとして設定された後に変更される可能性がある状況でも便利です修正/突然変異がプロパティにも適用されることを意味します)。

119
Joshua Nozzi

IOSリファレンスライブラリの メモリ管理プログラミングガイド には、割り当てとコピーの基本があり、類推と例があります。

copyオブジェクトのコピーを作成し、保持カウント1で返します。オブジェクトをコピーする場合、そのコピーを所有します。これは、「コピー」が返されるオブジェクトを指すWordコピーを含むすべてのメソッドに適用されます。

retainオブジェクトの保持カウントを1増やします。オブジェクトの所有権を取得します。

releaseオブジェクトの保持カウントを1減らします。オブジェクトの所有権を放棄します。

32
Larry Hipp
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)
8
srivas
  1. 割り当てます

    • assignはデフォルトのプロパティ属性です
    • assignは、プロパティのセッター実装を合成する方法をコンパイラに指示するプロパティ属性です
  2. コピー:

    • オブジェクトが変更可能な場合、コピーが必要です
    • copyは、ガベージコレクションされていない環境で明示的に解放する必要があるオブジェクトを返します(たとえば、deallocで)
    • コピーを保持しているため、オブジェクトを終了したらオブジェクトを解放する必要があります
  3. 保持する:

    • 割り当て時に新しい値を「-retain」に送信し、古い値を「-release」に送信することを指定します
    • あなたが保持することを書く場合、それは強いように自動で動作します
    • 「alloc」などのメソッドには、暗黙の「保持」が含まれます
4
Chen Rui