1

たとえば、次の定義があるとしますMyClass

@interface MyClass
{
    ClassWithBigMemoryUsage* cwbmu;
}

-(void) setClassWithBigMemoryUsage:(ClassWithBigMemoryUsage*) assignment; // where cwbmu = assignment;

をインスタンスおよびインスタンスmyClassInstanceとして作成し、のフィールドとしてsetを呼び出すと、オブジェクトの新しいインスタンス(追加の割り当てられたメモリを意味する)が作成されるか、または単にのフィールドを参照する(オブジェクトの追加メモリが割り当てられました)。MyClasscwbmuInstanceClassWithBigMemoryUsage[myClassInstance setClassWithBigMemoryUsage:cwbmuInstance]cwbmuInstancemyClassInstanceClassWithBigMemoryUsagemyClassInstancemyClassInstancecwbmuInstance

4

1 に答える 1

3

すべての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

于 2013-02-15T02:13:54.917 に答える