私はObjectiveCを初めて使用します。ポインターの概念を含むCの基本的な知識があります。2つの基本的な質問があります。
- 誰かが割り当て、コピー、保持の違いをいくつかの例えで説明できますか?
- ポインター変数を返す関数をどのように処理し、リターンポインターを介してメッセージングをどのように実行しますか?
回答:
変更されたドキュメントに対する更新された回答
情報は現在、ドキュメント内のいくつかのガイドに分散しています。必読のリストは次のとおりです。
この質問への答えは、ARC管理のアプリケーション(新しいプロジェクトの最新のデフォルト)を使用しているか、手動のメモリ管理を強制しているかによって完全に異なります。
割り当てと弱い-割り当てを使用して、オブジェクトを保持したりキュレートしたりせずに、プロパティのポインタをオブジェクトのアドレスに設定します。割り当てが解除された場合にプロパティが自動的にnilを指すようにするには、weakを使用します。ほとんどの場合、適切なクリーンアップを実行しない場合は、割り当て解除されたオブジェクト(メモリアドレスの不正アクセス-" ")にアクセスしようとしないようにweakを使用することをお勧めしますEXC_BAD_ACCESS
。
保持とコピー-宣言されたプロパティはデフォルトで保持を使用し(したがって、完全に省略できます)、別のオブジェクトがプロパティに割り当てられているか、nilに設定されているかに関係なく、オブジェクトの参照カウントを自動的に管理します。copyを使用して、新しく割り当てられたオブジェクトに-copy
メッセージを自動的に送信します(これにより、渡されたオブジェクトのコピーが作成され、代わりにそのコピーがプロパティに割り当てられます-割り当てられたオブジェクトがとして設定された後に変更される可能性がある状況では便利です(必須でも)他のオブジェクトのプロパティ(これは、変更/変更がプロパティにも適用されることを意味します)。
iOSリファレンスライブラリのメモリ管理プログラミングガイドには、類推と例を使用して、割り当て、コピー、および保持の基本があります。
copy オブジェクトのコピーを作成し、保持カウント1で返します。オブジェクトをコピーする場合は、そのコピーを所有します。これは、「copy」が返されるオブジェクトを指す、copyという単語を含むすべてのメソッドに適用されます。
保持オブジェクトの保持カウントを1つ増やします。オブジェクトの所有権を取得します。
releaseオブジェクトの保持カウントを1つ減らします。オブジェクトの所有権を放棄します。
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"
)
割当
コピー:
保持: