Должен ли я использовать ivars в Objective-C?

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

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

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

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


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

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

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

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

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

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

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

Interesting Posts

Запросы URL-адресов iOS. Проблемы с семафором

IOS, UIView, обнаружение скрытого изменения состояния в Subview

Он не показывает обновленную базу данных вручную в объекте c

игра в WAV-файл на iOS Safari

Создание для iOS, если registerForRemoteNotificationTypes: не поддерживается в iOS 8.0 и более поздних версиях

Swift Как обновить URL-адрес видео в AVPlayer при нажатии на кнопку?

Получен код состояния = 11 при уведомлении APNS

Как использовать NSString из класса NSObject в нескольких классах (View Controllers)

Xcode 6 beta 6 – Элементы на главной панели рассказов исчезли / отключены

Как сериализовать UIImage в JSON?

AVCaptureSession начинается, а затем сразу же

Обновляйте локальную базу данных в фоновом режиме с помощью тихого уведомления о нажатии, когда приложение не запущено

Вернуть предыдущее приложение на передний план, когда пользователь выполнил мое приложение iOS

Как я могу узнать, имеет ли устройство iOS GPS?

Ошибка приложения из-за NSInvalidArgumentException, но не может найти его

Давайте будем гением компьютера.