3

次のコードでクラッシュが発生しています。self.itemsはString 型の属性を持つNSArrayofです:NSManagedObjects"id"

NSMutableArray *allIDs = [self.items mutableArrayValueForKey:@"id"];
NSArray *presentIDs = // a subset of allIDs
[allIDs removeObjectsInArray:presentIDs];

クラッシュメッセージは次のとおりです。

'Unacceptable type of value for attribute: property = "id"; desired type = NSString; given type = __NSArrayM; value = ....

デバッガーで出力すると、通常のではなく でallIDあることがわかります。NSKeyValueSlowMutableArray__NSArrayMNSMutableArray

だから私はこれに変更し、それは動作します:

NSMutableArray *allIDs = [[self.items valueForKey:@"id"] mutableCopy];

前者をクラッシュさせ、後者を機能させるこれら2つの呼び出しの違いは何ですか? KVO とプロキシ コレクションに関係があるのではないかと思いますが、よくわかりません。

4

1 に答える 1

2

KVO とプロキシ コレクションに関係があるのではないかと思いますが、よくわかりません。

そうです、KVO、KVC (Key-Value Coding) ではありませんが。

NSKeyValueCoding プロトコル リファレンスから

mutableArrayValueForKey:

指定されたキーで指定された順序付けられた対多関係への読み取り/書き込みアクセスを提供する可変配列プロキシを返します。

つまり、 の目的はmutableArrayValueForKey:、レシーバーのプロパティに格納されている不変の配列への可変アクセスを提供することです。

一方、KVC は、ターゲット配列がその各要素にメッセージを伝達し、すべての結果値の配列を返すようにするvalueForKey:タイプの for プロパティの特別な実装を提供します。NSArrayvalueForKey:

したがって、2番目の例では、項目配列に送信すると、配列内の各項目にvalueForKey:送信することによって取得された値の配列が得られました。valueForKey:@"id"最初の例は、items 配列自体に type のidという名前のプロパティがある場合にのみ機能しますNSArray *

于 2014-05-22T17:41:36.113 に答える