2012-03-30 4 views
1

クラスのプロパティとインスタンス変数の所有権の重要な概念を理解したいと思います。この場合はNSArrayを使用します。クラスは他のクラスのNSArrayをコピーし、それをはっきりと所有しています

NSArrayへの参照を別のクラスに渡し、そのクラスのiVarにそれを設定するとします。例えば:次に

第一の技術

OtherClass.h

@property (nonatomic, retain) NSArray * otherClassArray;

CurrentClass.m

otherclass.otherClassArray=myArray

OtherClassmyArrayを保持していても、CurrentClassmyArrayに変更された場合、otherclass.otherClassArrayも変更されます。

だから、これはそれを行うには良い方法である、または私は間違って上記の私はとにかく次から期待するものでしょう午前:

第二の技術

CurrentClass.m

otherclass.otherClassArray=[NSArray arrayWithArray:myArray]

myArrayの変更がotherClassArrayに影響しないように別個のコピーが作成されました。そういうアプローチが同じことをしているのでしょうか?

更新日:上記の私の2番目の手法を使用するべきであるか使用しない理由はありますか?copyをプロパティに使用する理由はありますか?どちらのテクニックでも、私のクラスが所有する新しいNSArrayが生成されるようです。

答えて

1

そのクラスの変更可能なサブクラス(特に、NSStringや様々なコレクションクラスを)持っているcopyとして宣言することthat性質推奨itが​​で正確理由です:OtherClass

@property (nonatomic, copy) NSArray * otherClassArray; 

次にあなたがプロパティを設定するたびに独自のバージョンの配列を取得します。

あなたの2番目のテクニックはcopyというプロパティを宣言したのと同じ結果を返しますが、コピーを望むかどうかにかかわらず、所有者の所有者に任せてください。言い換えれば、カプセル化の原則は、クライアントコード(CurrentClass)は、OtherClassがそれ自身のバージョンのオブジェクトを持つ必要があることを知っている責任を負いません。それは設計と保守性の問題です。

+0

私は例としてNSArrayを使用していましたが、どのような種類のクラスであったとしても、同じ問題です。私の例では、新しいクラスを作成しない限り、クラスにはオブジェクトデータのコピーはありません。 – johnbakers

+0

別の言い方をすれば、プロパティで 'copy'を使わないことで、私の2番目の例は、別のオブジェクトデータをOtherClassに与えます。 – johnbakers

+0

はいとはい。私が言ったように、 'copy'を使うかどうかを決定する重要な要素は、プロパティのクラスが可変サブクラスを持っているかどうかです。 –

関連する問題