Цель-С:как предотвратить утечку абстракции
-
23-09-2019 - |
Вопрос
Я так понимаю, что в Objective-C я должен объявить переменные экземпляра как часть интерфейса моего класса, даже если эти переменные являются деталями реализации и имеют частный доступ.
В «субъективном» C я могу объявить переменную в своем файле .c, и она не будет видна за пределами этого модуля компиляции.Я могу объявить ее в соответствующем файле .h, и тогда любой, кто ссылается на этот модуль компиляции, сможет увидеть эту переменную.
Интересно, есть ли эквивалентный выбор в Objective-C, или мне действительно нужно объявить каждый ivar в .h для моего класса.
Ари.
Решение
Ари,
Хорошей ссылкой на то, как выполнить «невидимые» объявления переменных экземпляра, может служить найти здесь с уважением отдана должное Мэтту Галлахеру.
Надеюсь, это поможет, Фрэнк
Другие советы
Переменные экземпляра традиционно необходимы для определения размера класса.Прямой доступ к иварам всегда был плохой практикой, и дело не в этом.В современной среде выполнения это менее необходимо, но в любом случае это не является утечкой абстракции, если только клиенты не полагаются на ivars класса, что должно быть невозможно, поскольку вы объявляете их как @protected
или @private
, верно?
Чтобы ограничить доступ, вы можете использовать @private
или @protected
ключевые слова:
@interface Foo : NSObject {
@private
int barPrivate;
@protected
int barProtected;
@public
int barPublic;
}
@end
РЕДАКТИРОВАТЬ: Почисти всё, оказывается, мне очень нужно поспать.
ивары @protected
по умолчанию (хотя @private
и @protected
не гарантируйте, что другие классы не смогут получить к ним доступ — вы всегда можете получить доступ к ivars с помощью getValue:forKey:
).В любом случае вам никогда не следует напрямую обращаться к ivars из других классов - «выбор» заключается в том, предоставлять ли ivars как свойства (вам просто нужно полагаться на то, что все классы, следующие соглашению, не имеют прямого доступа к ivars).
В новой среде выполнения Objective-C вам вообще не нужно объявлять ivars, поскольку они могут быть синтезированы во время выполнения, но, к сожалению, это не работает с симулятором iPhone, поэтому на данный момент лучше просто объявить все ivars в файле .h.