Objective C: как предотвратить утечки абстракции

Я заключаю, что в Objective C должен объявить переменные экземпляра как часть интерфейса моего класса, даже если эти переменные являются деталями реализации и имеют частный доступ.

В "субъективном" C я могу объявить переменную в своем.c файле, и это не видимо за пределами той единицы компиляции. Я могу объявить это в соответствующем.h файле и затем любом, кто связывается в той единице компиляции, видят переменную.

Интересно, существует ли эквивалентный выбор в Objective C, или если я должен действительно объявить каждый ivar в.h для моего класса.

Ari.

5
задан iter 30 March 2010 в 00:55
поделиться

4 ответа

Ari,

Хорошую ссылку на то, как выполнять «невидимые» объявления переменных экземпляра, можно найти здесь с уважением к Мэтту Галлахеру.

Надеюсь, это поможет, Фрэнк

2
ответ дан 15 December 2019 в 00:56
поделиться

Чтобы ограничить доступ, вы можете использовать ключевые слова @private или @protected :

@interface Foo : NSObject {
    @private
    int barPrivate;

    @protected
    int barProtected;

    @public
    int barPublic;
}
@end

EDIT: Поцарапайте все, оказывается, мне действительно нужно немного поспать.

0
ответ дан 15 December 2019 в 00:56
поделиться

ivars по умолчанию @protected (хотя @private и @protected не не гарантируем, что другие классы не смогут получить к ним доступ - вы всегда можете получить доступ к ivars с помощью getValue: forKey: ). В любом случае вы никогда не должны напрямую обращаться к ivars из других классов - «выбор» состоит в том, предоставлять или нет ivars как свойства (вам просто нужно полагаться на все классы, следующие соглашению, чтобы не обращаться к ivars напрямую).

В новой среде выполнения objective-c вам вообще не нужно объявлять ivars, поскольку они могут быть синтезированы во время выполнения, но, к сожалению, это не работает с симулятором iPhone, поэтому на данный момент лучше всего просто объявить все ivars в файле .h.

0
ответ дан 15 December 2019 в 00:56
поделиться

Переменные экземпляра традиционно необходимы для определения размера класса. Прямой доступ к ivars всегда был плохой практикой, и дело не в этом. В современной среде выполнения это менее необходимо, но в любом случае это не утечка абстракции, если только клиенты не полагаются на ivars класса, что должно быть невозможно, поскольку вы объявляете их как @protected или @private , верно?

2
ответ дан 15 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: