Вопрос

Я так понимаю, что в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top