Вопрос

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

Это было полезно?

Решение

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

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

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


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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top