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


83

私はObjectiveCを初めて使用します。ポインターの概念を含むCの基本的な知識があります。2つの基本的な質問があります。

  1. 誰かが割り当て、コピー、保持の違いをいくつかの例えで説明できますか?
  2. ポインター変数を返す関数をどのように処理し、リターンポインターを介してメッセージングをどのように実行しますか?

回答:


126

変更されたドキュメントに対する更新された回答

情報は現在、ドキュメント内のいくつかのガイドに分散しています。必読のリストは次のとおりです。

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

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

保持とコピー-宣言されたプロパティはデフォルトで保持を使用し(したがって、完全に省略できます)、別のオブジェクトがプロパティに割り当てられているか、nilに設定されているかに関係なく、オブジェクトの参照カウントを自動的に管理します。copyを使用して、新しく割り当てられたオブジェクトに-copyメッセージを自動的に送信します(これにより、渡されたオブジェクトのコピーが作成され、代わりにそのコピーがプロパティに割り当てられます-割り当てられたオブジェクトがとして設定された後に変更される可能性がある状況では便利です(必須でも)他のオブジェクトのプロパティ(これは、変更/変更がプロパティにも適用されることを意味します)。


2
おかげさまで、Apple Devの基本を読んで、現在の開発についてメモリ管理に苦労している「objc_msgSend()でクラッシュした」ので、プロパティの理解を修正することを考えました。 stackoverflow.com/questions/4506205/…–
Sabha B

2
ちょっと注意してください、答えへのリンクはリンゴのサイトの一般的な「ページが見つかりません」に行きます。:それは、「Macデベロッパライブラリ」このSOの答えは役に立つ情報を持っているにリダイレクトstackoverflow.com/questions/2255861/...
hippeelee

1
ドキュメントが変更され、1つの便利な場所になくなったため、更新が難しいものです。Appleドキュメントチームにフィードバックが送信されました。
Joshua Nozzi 2014年

33

iOSリファレンスライブラリのメモリ管理プログラミングガイドには、類推と例を使用して、割り当て、コピー、および保持の基本があります。

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

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

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


返信ありがとうございます。1.ClassAには-(クラスB *)functionNameというプロパティがあります。2.ClassBにはメソッドがあります–(void)setHeight; 3.ClassCインターフェースClassA * tempAをretainとして宣言しました。4.コンストラクターでのクラスCの実装このステートメントがありますClassB * tempB = tempA.functionName; 5. tempB初期化の次の行でメッセージ(tempB。setHeight;)を送信しようとすると、プログラムは正常に動作します。
Sabha B

6.同じステートメント(tempB。setHeight;)をいくつかの関数に入れて同じ関数を呼び出すと、プログラムがobjc_msgSend()でクラッシュします。
Sabha B

8
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"
)

2
周囲の説明はあなたの答えを真剣に改善するでしょう。
zx485 2016年

4
  1. 割当

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

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

    • 新しい値を割り当て時に「-retain」で送信し、古い値を「-release」で送信するように指定します
    • あなたが保持を書くならば、それは強いように自動的に働きます
    • 「alloc」のようなメソッドには、暗黙の「retain」が含まれます
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.