В каких ситуациях объект не будет соответствовать кодированию значения ключа? - PullRequest
3 голосов
/ 22 июля 2009

В настоящее время я изучаю все, что связано с кодированием значения ключа.

В документах говорится:

Любой объект в последовательности ключей это не соответствует кодирования значения ключа за соответствующий ключ получает valueForUndefinedKey: сообщение.

Я пытаюсь представить ситуацию, когда объект не соответствует кодированию значения ключа. Как это могло случиться? Когда я подкласс UIView, это, очевидно, соответствует, верно? Но когда я просто создаю свой собственный объект с NSObject в качестве суперкласса, как это? И когда я создаю класс без суперкласса, то наверняка это не соответствует k-v?

Ответы [ 2 ]

8 голосов
/ 22 июля 2009

Если вы внимательно прочитаете, вы увидите, что написано "кодирование значения ключа для соответствующего ключа ". По сути, это означает, что у вас нет подходящих методов KVC для ключа, который вы запрашивали. Поэтому, если я сделаю [[NSString stringWithString:@"foo"] valueForKey:@"dippingSauce"], он упадет до valueForUndefinedKey:, потому что NSString не является KVC-совместимым для ключа «dippingSauce» - у него нет dippingSauce метода экземпляра или dippingSauce ivar.

4 голосов
/ 22 июля 2009

В нем написано, что «это не соответствует кодированию значения ключа для соответствующего ключа ». Что это значит, что

@interface MyObject : NSObject {
  NSString *foo;
  NSString *bar;
}

@property (nonatomic, retain) NSString *foo;
@property (nonatomic, retain) NSString *bar;

@end

@interface MyObject

@synthesize foo;
@synthesize bar;

@end

Соответствует "foo" и "bar", но не "baz."

Для простых свойств, которые есть в нем, по умолчанию все подклассы NSObject реализуют базовый KVC. С коллекциями становится сложнее. Для того, чтобы KVC работал правильно для коллекций (так что вы можете сделать что-то вроде:

NSArray *people = ... ;
NSArray *firstNames = [people valueForKey:@"firstName"];

Это требует от вас реализации определенных дополнительных методов. В целом, крупнейшим пользователем этой функциональности являются привязки Какао (которые недоступны на iPhone), полученные из CoreData (который в любом случае генерирует эти дополнительные методы сбора данных), поэтому обычно они обрабатываются в основном автоматически. Как правило, люди не заботятся о полной поддержке KVC словарей или массивов в своих объектах, если только они не собираются на самом деле их выставлять. Вы можете прочитать о соответствии в руководстве KVC.

...