3

キー値のコーディングと対多の関係について少し混乱しています。そのような関係があるときは、[object mutableArrayValueForKey:@"key"]; を使用する必要があることを読みました。その順序付けられた関係でオブジェクトを保持する可変配列を取得します。

私が理解していないのは、mutableArrayValueForKey と単なる valueForKey の違いです。

例を挙げて説明しましょう (配列はプロパティとして自己セットアップの NSMutableArray です):

id array1= [self valueForKey:@"array"];

NSLog(@"first element %@",[array1 objectAtIndex:1]);

id array2 = [self mutableArrayValueForKey:@"array"];

NSLog(@"first element %@",[array2 objectAtIndex:1]);

どちらの呼び出しもまったく同じものを返します。その場合、2番目のものの利点または違いは何ですか?

乾杯!

4

2 に答える 2

6

mutableArrayValueForKey「配列」を返すのではなく、「配列」のプロキシを返します。クラスを印刷すると、これを確認できます。

NSLog(@"%@", [self.array class]);
NSLog(@"%@", [[self valueForKey:@"array"] class]);
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]);

これは以下を出力します:

2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray

そのプロキシがどのように機能するかの詳細については、ドキュメントを読んでください。mutableArrayValueForKeyこの特定のケースでは、たまたま実際の NSMutableArray を ivar として持っています。しかし、そのような ivar がなかったらどうなるでしょうか。countOf<Key>や などのメソッドを使用して、プロパティをサポートする ivar なしで KVC を実装できますobjectIn<Key>AtIndex:。KVC メソッドに適切な結果を返すことができる限り、実際の「配列」ivar が存在するというルールはありません。

しかし、NSMutableArray インターフェイスを公開したいが、実際の NSMutableArray を持っていない場合はどうすればよいでしょうか? それmutableArrayValueForKeyがそのためです。アクセスすると、KVC メソッドに変換されて返されるプロキシが返されますinsertObject:in<Key>AtIndex:

これは、実際のivarがある場合でも発生します(あなたの場合のように)。プロキシは実際のオブジェクトと同じように動作するため、気付かないだけです。

于 2010-02-25T01:17:10.560 に答える
0

最初の要素は、実際にはobjectAtIndex:0ではなくobjectAtIndex:1です。

また、2 番目の方法では、キーの値が不変の配列であっても、返された配列をaddObject:andで変更できることが保証されます。removeObjectAtIndex:@"array"

于 2010-02-25T00:51:36.633 に答える