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

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

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

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

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


person Thanks    schedule 22.07.2009    source источник


Ответы (2)


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

person Chuck    schedule 22.07.2009
comment
Я понимаю :) так что весь материал соответствия KVC привязан не ко всему классу, а к каждой переменной или свойству экземпляра. Приятно - person Thanks; 22.07.2009
comment
+1 за успешное использование dippingSauce в примере программирования. - person ; 08.11.2010

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

@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"];

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

person Louis Gerbarg    schedule 22.07.2009
comment
Какие дополнительные методы необходимы? Это должно работать до тех пор, пока все объекты в people отвечают на firstName. - person Chuck; 22.07.2009
comment
хорошо, если я не создам свойство для переменной экземпляра, то есть не создам геттер/сеттер, я не смогу получить к нему доступ через KVC? - person Thanks; 22.07.2009
comment
Чак: извините, этот пример на самом деле будет работать, но некоторые из более сложных вещей, таких как @distinctUnionOfSets и т. д., могут иметь проблемы. Спасибо: Нет, свойства не нужны для соответствия KVC, они просто нужны, поскольку они заставляют вас выражать семантику памяти объектов. - person Louis Gerbarg; 22.07.2009