すべてのObjective-Cオブジェクトはポインタ(したがって*
in ClassWithBigMemoryUsage *
)であるため、オブジェクトは参照によって渡され、渡されたときにコピーされることを心配する必要はありません。
ただし、メソッドが実際に代入を行うときにオブジェクトがコピーされるかどうかは、明らかにsetterメソッドの実装に依存します。これを行うだけの場合:
cwbmu = assignment;
ポインタ値を設定するだけで、コピーは行われません。もちろん、それはオブジェクトなので、次のようにして、おそらくそれを保持する必要があります。
[cwbmu autorelease];
cwbmu = [assignment retain];
しかし、結果は同じです。Objective-Cインスタンスを確実に確実にコピーする唯一の方法は、明示的にcopy
メッセージを送信することです。
[cwbmu autorelease];
cwbmu = [assignment copy];
そして、これはNSCopying
プロトコルに準拠するクラスでのみ機能します。
最後に、@property
宣言と@synthesize
'dメソッドを使用している場合は、これらの動作のどれを使用するかを指定できます。プロパティを宣言するには、次の3つの方法で、それぞれ説明されている3つの方法を使用します。
@property (assign) ClassWithBigMemoryUsage* cwbmu;
@property (retain) ClassWithBigMemoryUsage* cwbmu;
@property (copy) ClassWithBigMemoryUsage* cwbmu;
また、ARCでは、このメモリ管理は自動的に行われるため、直接制御することはできません。代わりに、weak
オプション(の代わりにassign
)またはオプション(のstrong
代わりに)を使用しますretain
。古い名前は引き続き機能しますが、新しい名前を使用すると、実際に何をしているかがより明確になります。このcopy
オプションは、ARCでも引き続き有効です。
最後に、ARCを使用しているが、使用していない@property
場合、インスタンス変数はデフォルトでとして管理されstrong
ます。__weak
これは、ivar宣言の前に付けることで変更できます。ただし、weak
すべてのアーキテクチャでサポートされているわけではありません。その場合__unsafe_unretained
は代わりに使用できますが、後者の場合、割り当て解除されたオブジェクトポインタはゼロになりませnil
ん(に設定されます)__weak
。