В чем разница между objectForKey
и valueForKey
? Я посмотрел оба документа в документации, и они показались мне одинаковыми.
источник
В чем разница между objectForKey
и valueForKey
? Я посмотрел оба документа в документации, и они показались мне одинаковыми.
objectForKey:
это NSDictionary
метод. An NSDictionary
является коллекционным классом, аналогичным классу an NSArray
, за исключением того, что вместо использования индексов он использует ключи для различения элементов. Ключ - это произвольная строка, которую вы предоставляете. Никакие два объекта не могут иметь одинаковый ключ (точно так же, как никакие два объекта не NSArray
могут иметь одинаковый индекс).
valueForKey:
это метод КВК Это работает с любым классом. valueForKey:
позволяет получить доступ к свойству, используя строку для его имени. Например, если у меня есть Account
класс со свойством accountNumber
, я могу сделать следующее:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Используя KVC, я могу получить доступ к свойству динамически:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Это эквивалентные наборы утверждений.
Я знаю, ты думаешь: вау, но саркастично. KVC выглядит не так уж и полезно. На самом деле это выглядит "многословно". Но когда вы хотите что-то изменить во время выполнения, вы можете сделать много интересных вещей, которые намного сложнее в других языках (но это выходит за рамки вашего вопроса).
Если вы хотите узнать больше о KVC, есть много учебников, если вы Google, особенно в блоге Скотта Стивенсона . Вы также можете проверить ссылку на протокол NSKeyValueCoding .
Надеюсь, это поможет.
Когда вам это
valueForKey:
нужно, вам нужно дать ему NSString, тогда как выobjectForKey:
можете взять любой подкласс NSObject в качестве ключа. Это потому, что для кодирования значения ключа ключи всегда являются строками.Фактически, в документации говорится, что даже когда вы передаете
valueForKey:
NSString, она всеobjectForKey:
равно будет вызываться, если строка не начинается с@
, в этом случае она вызывает[super valueForKey:]
, что может вызвать вызов,valueForUndefinedKey:
который может вызвать исключение.источник
Вот отличная причина, чтобы использовать
objectForKey:
везде, где это возможно, вместоvalueForKey:
-valueForKey:
с неизвестным ключом будет выброшеноNSUnknownKeyException
высказывание «этот класс не соответствует значению ключа для кода».источник
Как уже говорилось,
objectForKey:
тип данных -:(id)aKey
этоvalueForKey:
тип данных:(NSString *)key
.Например:
Таким образом,
valueForKey:
будет принимать только строковое значение и является методом KVC, тогда какobjectForKey:
будет принимать любой тип объекта.Значение в
objectForKey
будет доступно для объекта того же типа.источник
Я постараюсь дать исчерпывающий ответ здесь. Большая часть пунктов появляется в других ответах, но я нашел каждый ответ неполным, а некоторые неправильным.
Прежде всего,
objectForKey:
этоNSDictionary
метод, аvalueForKey:
метод протокола KVC требуется для любого класса жалоб KVC, включая NSDictionary.Кроме того, как писал @dreamlax, документация намекает на то, что
NSDictionary
егоvalueForKey:
метод использует ИСПОЛЬЗОВАНИЕ егоobjectForKey:
реализации. Другими словами -[NSDictionary valueForKey:]
звонки[NSDictionary objectForKey:]
.Это подразумевает, что
valueForKey:
это никогда не может быть быстрее, чемobjectForKey:
(на одном и том же ключе ввода), хотя тщательное тестирование, которое я провел, подразумевает разницу от 5% до 15%, более миллиардов случайного доступа к огромному NSDictionary. В нормальных ситуациях - разница незначительна.Далее: протокол KVC работает только с
NSString *
ключами, следовательно,valueForKey:
будет принимать толькоNSString *
(или подкласс) в качестве ключа, в то время какNSDictionary
может работать с другими типами объектов в качестве ключей - так что «нижний уровень»objectForKey:
принимает любой объект с возможностью копирования (совместимый с протоколом NSCopying) в качестве ключа.Наконец,
NSDictionary's
реализацияvalueForKey:
отклоняется от стандартного поведения, определенного в документации KVC, и НЕ будет выдаватьNSUnknownKeyException
ключ, который не может найти - если только это не «специальный» ключ, начинающийся с «@», что обычно означает « агрегация "функциональная клавиша (например@"@sum, @"@avg"
). Вместо этого он просто вернет ноль, когда ключ не найден в NSDictionary - ведя себя так же, какobjectForKey:
Ниже приведен тестовый код для демонстрации и подтверждения моих заметок.
источник