Ответ 1
Переменная экземпляра уникальна для класса. По умолчанию доступ к нему возможен только классу и подклассам. Поэтому в качестве фундаментального принципа объектно-ориентированного программирования переменные экземпляра (ivars) являются частными - они инкапсулируются классом.
В отличие от этого, свойство является общедоступным значением, которое может соответствовать или не соответствовать переменной экземпляра. Если вы хотите сделать публикацию ivar, вы, вероятно, создадите соответствующее свойство. Но в то же время переменные экземпляра, которые вы хотите сохранить частными, не имеют соответствующих свойств, поэтому к ним нельзя получить доступ за пределами класса. Вы также можете иметь вычисленное свойство, которое не соответствует ivar...
Без свойства, ivars могут быть скрыты. Фактически, если ivar не объявлен в публичном заголовке, трудно даже определить, что такой ivar существует.
Простая аналогия была бы обернутой термоусадочной книгой. Свойством может быть title
, author
или hardcover vs softcover. "Иварцы" будут фактическим содержанием книги. У вас нет доступа к фактическому тексту, пока вы не владеете книгой; у вас нет доступа к ivars, если вы не владеете классом.
Более интересно, свойства лучше интегрируются во время выполнения. Современные 64-битные runtimes будут генерировать ivar для свойств accessor, поэтому вам даже не нужно создавать ivar. Свойства - это фактически методы:
// This is not syntactically correct but gets the meaning across
(self.variable) == ([self variable];)
(self.variable = 5;) == ([self setVariable:5];)
Для каждого свойства существуют два метода (если объявлено свойство readonly
, в этом случае есть только одно): есть получатель, который возвращает тот же тип, что и ivar, и имеет то же имя, что и ивар, а также сеттер, который не объявлен с помощью readonly
ivar; он возвращает void, и его имя просто добавляется к имени переменной.
Поскольку они являются методами, вы можете делать динамические вызовы. Используя NSSelectorFromString()
и различные методы performSelector:
, вы можете сделать очень динамичную программу со многими возможностями.
Наконец, свойства широко используются в Core Data и Key-Value Coding. Core Data - это расширенная инфраструктура для хранения данных в базе данных SQLite, обеспечивая четкий интерфейс Obj-C; KVC используется во всех основных данных и является динамическим способом доступа к свойствам. Он используется при кодировании/декодировании объектов, например, при чтении из XIB.