Я заметил, что многие интерфейсы Apple используют @private
перед их объявлениями переменных экземпляра. Есть ли хорошая причина для этого, и я должен что-то делать?Маркировка переменных экземпляра @private
ответ
Частные переменные экземпляра используются для разделения интерфейса от реализации. В Objective-C, поскольку объявление класса должно показать все переменные экземпляра, должен быть способ предотвращения доступа подклассов к тем, которые являются частью внутренней реализации. В противном случае другие программисты могли бы писать код, который зависит от этих внутренних переменных, что сделало бы невозможным, чтобы дизайнер классов внес изменения в внутренние элементы класса без нарушения существующего кода.
Оглядываясь на него по-другому, переменные экземпляра, которые являются не, отмеченные как частные, являются частью контракта с программистом подкласса, тогда как те, которые обозначены как private, не являются.
Это означает, что переменные экземпляра обычно должны быть помечены как закрытые, чтобы их можно было получить только через их методы доступа, если они вообще были. В противном случае кто-то мог бы легко написать подкласс вашего класса и просто создать аксессуар, чтобы сделать любую переменную экземпляра общедоступной.
Если вы не хотите, чтобы подклассы имели доступ к переменным, пометьте их @private.
Другой способ сделать это - объявить переменные экземпляра в разделе @implementation. Такие переменные неявно закрыты. Источник: Kochan: Программирование в Objective-C, четвертое издание. п. 199. Таким образом, неверно, что объявление класса должно отображать все переменные экземпляра, как указано e.James.
Единственная причина для объявления переменных экземпляра в @interface - позволить им наследоваться производным классом (подклассом).
Правильный способ сделать это в будущем - объявить его в расширении класса в файле .m. Это применимо для частных методов, а также для иваров и свойств. Расширение класса выглядит как неназванная категория '()', но имеет разные семантики и возможности. – ikuramedia
Спасибо за подробный ответ. Что касается написания подкласса для публикации переменных экземпляра, я уверен, что '@ private' не защищает от рекламы категорий. Мысли? –
Я попробовал, и вы абсолютно правы. Кажется, что категориям предоставляется доступ ко всем переменным экземпляра, включая частные. Полагаю, Objective-C по-прежнему дает вам достаточно веревки, чтобы повесить себя, если вы действительно хотите :) –
Вы также можете использовать функции выполнения для захвата ivar. Но если вы делаете такие вещи, вы знаете, что это грязный хак, в отличие от невинно, в зависимости от надкласса ivar, который, по вашему мнению, был надежным. – Chuck