Подтвердить что ты не робот

Свойство против переменной экземпляра

Возможный дубликат:
Есть ли разница между переменной экземпляра "и" свойство" в objective-c/cocoa/cocoa -touch?

Что такое объект Objective C, где вы хотите использовать переменную экземпляра vs property? Может ли кто-нибудь представить реальный пример?

4b9b3361

Ответ 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.