Переменные экземпляра объявлены в файле реализации ObjC - PullRequest
47 голосов
/ 22 июля 2011

Я смотрел вводное видео WWDC ARC и увидел то, чего никогда не видел в ObjC, когда какой-то инженер Apple говорил о примере стека.

Следующий код был использован для примера стека с ARC:

@implementation Stack 
{ 
    // instance variable declared in implementation context
    NSMutableArray *_array; 
}

- (id)init 
{
   if (self = [super init])
      _array = [NSMutableArray array];
   return self;
}

- (void)push:(id)x 
{
   [_array addObject:x];
}

- (id)pop 
{
   id x = [_array lastObject];
   [_array removeLastObject];
   return x;
}

@end

Обратите внимание, переменная экземпляра объявлена ​​сразу после директивы @ реализация .

Теперь меня удивило то, чтопеременная экземпляра может фактически быть объявлена ​​в файле реализации, не будучи статической переменной.Мои вопросы будут следующие:

  • Это какая-то новая конструкция, введенная в SDK для iOS 5, или это было возможно в течение длительного времени?
  • Будет ли хорошей практикой объявлять переменные экземпляра в реализации, если к переменным экземпляра нельзя получить доступ вне объекта?Кажется, это намного чище, чем использование директивы @private.

Ответы [ 3 ]

40 голосов
/ 31 июля 2011

Это действительно новая языковая функция, и если вы должны объявить свои ivars (а не просто объявить свойства и позволить компилятору генерировать ivars для вас), это хорошая практика.Ваши теоретически заголовочные файлы должны предоставлять только открытый интерфейс для ваших классов;все остальное относится к реализации.

Одно предостережение в том, что ивары файла реализации не видны подклассам, что иногда может быть немного неуклюжим, если у вас есть сгенерированные и получающие вручную методы установки и получения, которые необходимо создать для подкласса.

18 голосов
/ 03 августа 2011

Объявление iVars внутри реализации, безусловно, является новой конструкцией в цели C. Вы должны использовать xcode4.2 и выбрать компилятор LLVM в настройках вашей сборки. Идея состоит в том, чтобы сохранить ваши заголовочные файлы чище. Вы можете перечислить свои ивары в фигурных скобках как этот пример;

@implementation MyClass {    
  int var1;
  int var2;
}

Ответ, данный Рахулом, не совсем корректен, хотя вы можете расстаться с переменными так, как он говорит, они будут рассматриваться компилятором как статические. Вероятно, для случаев, в которых он их использовал, это не имело значения.

3 голосов
/ 09 октября 2012

Я новичок в Задаче C, и я обнаружил, что практика объявления иваров в заголовке очень странная. Это означает объявление внутреннего состояния объекта в его публичном заголовке, что не соответствует концепции инкапсуляции.

Например, скажем, у вас есть IPad. Apple не хочет, чтобы вы взламывали IPad, разглядывали и возились с элементами внутри. Если они хотят, чтобы вы что-то изменили, у iPad будет настройка, позволяющая вам это изменить.

Точно так же я не хочу, чтобы другие программисты видели ивары моих объектов. Это внутреннее состояние моего объекта. Если я хочу, чтобы вы изменили внутреннее состояние, я объявлю свойства для него.

Так что, как и в других языках, я бы скрывал свои ивары внутри файла реализации, а не объявлял их в заголовке.

Объявление ивара в заголовке кажется мне очень странным. Эти ivars зависят от реализации и просто не должны быть частью заголовочного файла.

...