2009-05-03 5 views
12

私はNSMutableArrayプロパティを持つObj-C 2.0クラスを持っています。 Appleは、次の構文を実装していないことをどのような理由がNSMutableArrayなどの変更可能なオブジェクトでObj-C 2.0のプロパティを使用する最も良い方法は何ですか?

@property (readwrite, copy) NSMutableArray *myArray; 

あります:私は、次のコードを使用する場合は、合成されたセッターは私に不変のコピーではなく、変更可能なものを与えるのだろうか?

@property (readwrite, mutablecopy) NSMutableArray *myArray; 

我々はmutablecopyを持っていないので、この(一見共通)状況に対処するための最良の方法は何ですか? -mutableCopyを行う自分のセッターを書くべきでしょうか?

答えて

4

としては、それを行うには正しい方法は可変配列プロパティ作ることはありませんが、前に言った。何をすべきの偉大な説明がありますKVCに準拠するように実装するhere

+0

この回答はhttp://stackoverflow.com/a/14814973/104790私は、カプセル化を破ることなく変更可能なコレクションを公開するソリューションを提示します。答えは、 'readonly'プロパティのためだけであるので、ここではこの質問には適していません。 –

+0

リンクはアクティブではありません。 – Krishnan

+0

@Krishnanは言ったように、リンクはもう機能しません。:-( –

1

あなた自身のセッターを書く必要があります。

14

私は以前同じ問題を抱えていましたが、document on the Apple Developer Connectionがセッターの独自の実装を提供することを推奨しています。リンクされたドキュメントのコードサンプル:

@interface MyClass : NSObject { 
    NSMutableArray *myArray; 
} 
@property (nonatomic, copy) NSMutableArray *myArray; 
@end 

@implementation MyClass 

@synthesize myArray; 

- (void)setMyArray:(NSMutableArray *)newArray { 
    if (myArray != newArray) { 
     [myArray release]; 
     myArray = [newArray mutableCopy]; 
    } 
} 
3

可変配列を渡すことは実際にはココアでは一般的ではありません。プライベートな変更可能な配列を内部ストレージとして使用できますが、単純なNSArrayオブジェクトを使用してメソッドを作成して、そこからオブジェクトを追加または取得します。これは、なぜmutablecopyプロパティ宣言がないのかもしれません。

5

ココアでNSMutableArrayを回すのは一般的ではありません。標準のCocoaプラクティスは、インデックス付き多対多のプロパティに対応するキー値コーディングmethodsを実装することです。

  1. 予想通り、キーと値が作品を観測(NSMutableArrayのを観察することはない - 何 - あなた - 希望行動につながるいくつかの例がある)
  2. あなたのデータ構造の実装がために隠されている:これは2つの利点がありますあなたが方法(例えば-[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i]、ないデータ構造自体を変異公開する。
0

NSMutableArrayの上に保持するための正しい方法は、保有財産である:

@property (nonatomic, retain) NSMutableArray *myArray; 

あなたがあなた自身のセッターまたは使用のコピーを作成する必要はありません。コピープロパティは、プロパティが別のオブジェクトに取り込まれたときに実際にコピーする必要があるNSArrayで使用する必要があります。たとえばNSMutableArrayオブジェクトをcopyプロパティを持つNSArray型のプロパティに代入すると、その時点からの不変プロパティとして「変更」をコピーするように変更可能な配列のコピーを作成する必要があります。

Marcは適切なアプローチをしていますが、通常はNSMutableArrayをオブジェクトのパブリックAPIの一部にしません。パブリックプロパティを持っている場合は、copyプロパティを持つNSArrayになります。

関連する問題