кодирование ключ-значение и отношения ко многим - PullRequest
3 голосов
/ 25 февраля 2010

Я немного запутался с кодированием значения ключа и отношениями ко-многим. Я читал, что при наличии таких отношений я должен использовать [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 ]

6 голосов
/ 25 февраля 2010

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 в качестве ивара. Но что, если бы не было такого ивара? Вы можете реализовать KVC без поддержки свойства ivar с помощью таких методов, как countOf<Key> и objectIn<Key>AtIndex:. Нет правила, что существует настоящий «массив» ivar, если вы можете возвращать разумные результаты в методы KVC.

Но что, если вы хотите предоставить интерфейс NSMutableArray, но у вас нет настоящего NSMutableArray? Вот для чего mutableArrayValueForKey. Он возвращает прокси-сервер, который при обращении к вам будет преобразован в методы KVC, включая отправку вам мутировавшего во многие методы, такие как insertObject:in<Key>AtIndex:.

Это даже происходит в том случае, если у вас есть настоящий ивар (как в вашем случае), вы просто не замечаете этого, потому что прокси ведет себя так же, как реальный объект.

0 голосов
/ 25 февраля 2010

Первый элемент на самом деле objectAtIndex:0, а не objectAtIndex:1.

Кроме того, второй метод гарантирует, что вы можете изменить возвращенный массив с addObject: и removeObjectAtIndex:, даже если значение для ключа @"array" является неизменным массивом.

...