0

「YourSecondApp」チュートリアルを実行していますが、masterBirdSightingListプロパティのセッターであるコード行を以下に追加しています。基本的な質問があります。

この行は、合成する場合と同じですか?そうでない場合、何が違うのですか?

- (void)setMasterBirdSightingList:(NSMutableArray *)newList
{
     if (_masterBirdSightingList != newList) {
            _masterBirdSightingList = [newList mutableCopy];
     }
}
4

1 に答える 1

3

プロパティが次のように定義されている場合:

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

この場合、このメソッドを実装することは、単にを使用することと同じではありません@synthensize masterBirdSightingList;

可変コンテナタイプのセマンティクスを使用してプロパティを定義することcopyは、デフォルトの合成セッターを使用して実際に期待どおりに機能しません。

明示的なメソッドがないと、実際には、配列の不変のコピーを参照するプロパティになります。

合成されたメソッドに依存する代わりに、投稿したコードを使用することで、元の配列の可変コピーを持つという適切で期待される動作が得られます。

これを確認する別の方法は、を呼び出すとcopy、ではなく、NSMutableArrayが返されることです。これが、デフォルトの合成プロパティセッターが期待どおりに機能しない理由です(可変コンテナープロパティを処理する場合)。したがって、セッターを自分で実装し、パラメーターを呼び出す必要があります。NSArrayNSMutableArraymutableCopy

于 2012-12-12T20:51:04.210 に答える