Objective-C: как предотвратить утечку абстракции - PullRequest
5 голосов
/ 30 марта 2010

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

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

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

Ари.

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

Ари,

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

Надеюсь, это поможет, Frank

2 голосов
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

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

0 голосов
/ 30 марта 2010

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

@interface Foo : NSObject {
    @private
    int barPrivate;

    @protected
    int barProtected;

    @public
    int barPublic;
}
@end

РЕДАКТИРОВАТЬ: Поцарапать все, оказывается, мне действительно нужно немного спать.

...