UPDATE
Ответ ниже был написан до того, как была реализована языковая функция объявления переменных экземпляра в реализации. Предпосылка вопроса теперь больше не действительна. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @interface
, если вы не хотите быть публичным.
Это похмелье от того факта, что Objective-C возник как довольно тонкий слой, построенный поверх C. Способ C состоит в том, чтобы определить интерфейс для модуля (не путать с Java interface
) в заголовке файл и буквально включить его в каждую единицу компиляции. Это похоже на автоматическое копирование и вставку объявлений в начало каждого скомпилированного файла. Если это кажется примитивным, то это потому, что это так, но С - это 40-летний язык.
Вы должны определить переменные экземпляра - даже частные - в интерфейсе, потому что объекты Objective C реализованы как структуры C, которые сами являются просто блоками памяти и именованными смещениями в этом блоке. Структура, представляющая объект каждого класса, должна включать пространство для переменных экземпляра суперкласса, поэтому подклассам необходимо знать, по крайней мере, размер структуры C, представляющей суперкласс, а также смещение открытых и защищенных переменных экземпляра. К сожалению, это означает, что все переменные экземпляра, даже частные, должны быть представлены как часть внешнего интерфейса. * C ++, другая версия OO C страдает той же проблемой по тем же причинам.
Немного тяжело дважды записывать все сигнатуры методов, но вы к этому привыкли.
* С 64-битной средой выполнения вам больше не нужно объявлять ivars для синтезированных методов доступа в @interface
, но, поскольку все методы общедоступны, это по-прежнему означает раскрытие внутреннего состояния для внешнего мира, хотя и облегчает хрупкий базовый класс проблема.