Однако, я все еще не понимаю, в чем разница между KVC и методами доступа к свойствам?
KVC - это способ вызова методов доступа к свойству или иного доступа к свойству.
Что я подразумеваю под «иным доступом»? В целях KVC переменная экземпляра без методов доступа считается неформальным свойством. Он получит или установит значение переменной экземпляра напрямую, если не найдена соответствующая пара средств доступа. (Да, это не стоит использовать в современном коде. Всегда объявляйте @property
для всего, к чему вы хотите получить доступ в другом месте, и, наоборот, не используйте KVC для доступа к чему-либо, что не является публичной собственностью.)
Методы доступа к свойствам - это то, что KVC будет вызывать, если они существуют (предпочтительнее, как KVC, так и каждым здравомыслящим программистом, по сравнению с прямым доступом к ivar). Метод доступа может получить или установить переменную экземпляра, как это делают синтезированные методы доступа, или получить доступ к некоторому другому хранилищу.
Средства доступа - это реализация, свойства - это интерфейс, и KVC - это один из способов их использования.
А как мне отличить точки, которые вызывают setValue: forKeyPath: и простые методы доступа?
Путь ключа - это строка, тогда как выражение доступа к свойству - это выражение. Компилятор оценивает выражение доступа к свойству и переводит его в одно или несколько сообщений Objective-C, тогда как путь ключа оценивается KVC во время выполнения.
Итак, когда вы используете путь ключа:
[someObject setValue:theValue forKeyPath:@"foo.bar.baz"];
Вы знаете, что это ключевой путь, потому что (1) это строка, как указано в данном случае строковым литеральным синтаксисом @"…"
, и (2) вы передаете строку ключевого пути в setValue:forKeyPath:
для это оценить.
Использование ключевого пути - это использование KVC для доступа к именованным свойствам. Он будет отправлять любые соответствующие сообщения доступа от вашего имени.
Когда вы используете выражение доступа к свойству:
someObject.foo.bar.baz = theValue;
Вы знаете, что это выражение доступа к свойству, потому что вы не отождествляете свойства со строкой. Вы обращаетесь к ним (отправляете сообщения доступа) самостоятельно, в своем собственном коде.
Нет особых оснований использовать KVC в любой форме; если вы знаете свойство во время авторства / компиляции, лучше всего объявить @property
и получить доступ к свойству самостоятельно, будь то с помощью выражений доступа к свойству или выражений сообщений ([[[someObject foo] bar] setBaz:theValue]
). Время использования KVC - это когда вы не знаете, к какому свойству вы хотите получить доступ, до времени выполнения, что довольно редко. В основном это технология строительных блоков, лежащая в основе KVO, привязок какао, частей Core Animation и т. Д.
В большинстве случаев вы захотите получить доступ к свойствам только сами.