0

NSMutableArray があります

@property (copy, nonatomic) NSMutableArray *childrenArray;

今、私は次のように初期化します:

self.childrenArray = [NSMutableArray arrayWithArray:children];

children も上で nsmutable です。

子配列からオブジェクトを削除していたときに、次のエラーが発生しました。

[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent

remove が NSArray で呼び出されていることをすぐに理解したので、クエリは、NSMutableArray を返すはずのアクセサーが NSArray を返す理由です。

ありがとう、

4

1 に答える 1

2

まず、 @property は、設定されているオブジェクトにcopy文字どおり送信します。可変コレクションは、不変のコピーを作成することによってcopy応答します。copy可変コピーは、エッジケースで蔓延しています (その多くは、他の SO の質問でカバーされています)。

第二に、オブジェクト内の変更可能な状態へのアクセスを提供するプロパティは本当に必要ありません。また、変更可能なコレクション クラスを販売したくない場合もあります。


ブラント:

可変コレクションに送信copyすると、不変のコピーが返されます。プロパティは可変copy性を保持しません。

変更可能なインスタンスを設定/返すためにセッター/ゲッターを手動で実装することは、おそらく間違っています。


次のように考えてください。

「firstName」という名前のプロパティを持つ「Person」という名前のクラスがあります。そのプロパティが可変である場合、誰かが言うかもしれません:

 [[aPerson firstName] setString:@"Joe"];

つまり、誰かが変更したことを通知することなく、名前を変更できるようにしたいと思いますか? おそらくそうではありません。しかし、可変コンテナー内のオブジェクトの状態を公開することで、まさにそれが可能になります。

于 2012-08-23T04:13:44.197 に答える