Должен ли я использовать ivars в Objective-C? - PullRequest
7 голосов
/ 26 января 2012

У меня есть приложение, которое я пишу, которое использует только @properties.У меня нет ни одного ивара, объявленного вообще ни в одном из моих файлов классов.Насколько я понимаю, с введением @property ивары больше не нужны.Я кодирую в соответствии с лучшей практикой?Будет ли это в конечном итоге кусать меня в пословицу в долгосрочной перспективе?Я читал смешанные отзывы о том, что «правильно» и «неправильно» ...

Ответы [ 4 ]

15 голосов
/ 26 января 2012

Это не так много, что переменные экземпляра не нужны.Просто переменная экземпляра , объявления не нужны.Учитывая свойство и оператор @synthesize, компилятор позаботится о создании переменной экземпляра вместе с соответствующими методами доступа.

Нет ничего плохого в использовании исключительно свойств.Они упрощают управление памятью.Также нет ничего плохого в использовании iVars без свойств, если вы этого хотите.Если вы хотите использовать свойства, но не хотите рекламировать средства доступа для остального мира (т.е. поддерживать инкапсуляцию), рассмотрите возможность объявления ваших непубличных свойств в расширении класса (в основном это анонимная категория в вашем файле реализации).

11 голосов
/ 26 января 2012

Я, как правило, тоже не объявляю ивара. Я часто буду использовать @synthesize foo = foo_;, хотя для предотвращения прямого доступа, когда я имел в виду сквозной метод или наоборот. И я всегда позволяю компилятору автоматически синтезировать ivar с префиксом _ (что предотвращает случайный прямой доступ). доступ, согласно поразил фраза).

И, как сказал Калеб, все еще существуют плавающие ивары, вы просто не объявляете их явно, если вы действительно этого не хотите (чего, на самом деле, нет, поскольку открытые ивары в заголовках бесполезны для клиентов класса, если ваш API разработан соответствующим образом).

Я также обнаружил, что шумиха над «использовать только прямой доступ в init / dealloc, везде использовать setter / getter», чтобы быть в значительной степени раздутой и, таким образом, просто использовать setter / getter везде. Реальность такова, что если у вас есть наблюдатели во время инициализации / освобождения, вы уже в шланге; состояние объекта по определению не определено во время строительства / разрушения, и, таким образом, наблюдатель не может правильно рассуждать о состоянии.

<Ч />

Как указывает Калеб, еще одна причина использовать прямой доступ к ivar в init / dealloc состоит в том, чтобы избегать подклассов, которые реализуют пользовательскую логику сеттера / получателя, которая может нарушить работу из-за неопределенного состояния объекта во время init / dealloc.

Хотя это может быть правдой, я считаю это неприятным архитектурным недостатком для реализации сеттеров / геттеров с настраиваемым поведением. Это хрупко и со временем значительно усложняет рефакторинг кода. Кроме того, такое пользовательское поведение часто будет зависеть от другого состояния в объекте, и эта зависимость затем приводит к зависимостям порядка от изменений состояния, которые вообще не отражаются в кажущемся простом объявлении @property.

т.е. если ваши сеттеры и геттеры написаны так, что foo.bar = bad; не может быть выполнен в любое время при foo, то ваш код отключен.

2 голосов
/ 26 января 2012

Использование iVars определенно не является ошибкой, однако в настоящее время рекомендуется использовать @property.

0 голосов
/ 19 декабря 2013

Единственное место, где вы можете использовать ivar - это когда вы хотите объявить защищенное свойство. Вы объявляете свойство в файле .m для класса и объявляете его соответствующий ivar в .h с помощью директивы @protected. Это позволит вам иметь защищенный доступ в подклассе. Нет альтернативы для защищенного доступа к участникам.

...