Я заключаю, что в Objective C должен объявить переменные экземпляра как часть интерфейса моего класса, даже если эти переменные являются деталями реализации и имеют частный доступ.
В "субъективном" C я могу объявить переменную в своем.c файле, и это не видимо за пределами той единицы компиляции. Я могу объявить это в соответствующем.h файле и затем любом, кто связывается в той единице компиляции, видят переменную.
Интересно, существует ли эквивалентный выбор в Objective C, или если я должен действительно объявить каждый ivar в.h для моего класса.
Ari.
Ari,
Хорошую ссылку на то, как выполнять «невидимые» объявления переменных экземпляра, можно найти здесь с уважением к Мэтту Галлахеру.
Надеюсь, это поможет, Фрэнк
Чтобы ограничить доступ, вы можете использовать ключевые слова @private
или @protected
:
@interface Foo : NSObject {
@private
int barPrivate;
@protected
int barProtected;
@public
int barPublic;
}
@end
EDIT: Поцарапайте все, оказывается, мне действительно нужно немного поспать.
ivars по умолчанию @protected
(хотя @private
и @protected
не не гарантируем, что другие классы не смогут получить к ним доступ - вы всегда можете получить доступ к ivars с помощью getValue: forKey:
). В любом случае вы никогда не должны напрямую обращаться к ivars из других классов - «выбор» состоит в том, предоставлять или нет ivars как свойства (вам просто нужно полагаться на все классы, следующие соглашению, чтобы не обращаться к ivars напрямую).
В новой среде выполнения objective-c вам вообще не нужно объявлять ivars, поскольку они могут быть синтезированы во время выполнения, но, к сожалению, это не работает с симулятором iPhone, поэтому на данный момент лучше всего просто объявить все ivars в файле .h.
Переменные экземпляра традиционно необходимы для определения размера класса. Прямой доступ к ivars всегда был плохой практикой, и дело не в этом. В современной среде выполнения это менее необходимо, но в любом случае это не утечка абстракции, если только клиенты не полагаются на ivars класса, что должно быть невозможно, поскольку вы объявляете их как @protected
или @private
, верно?