Объявление переменной выше и ниже @interface - PullRequest
2 голосов
/ 16 марта 2012
int helloness;
@interface test : NSObject
@end

против

 @interface test : NSObject{
int helloness;
}
@end

Насколько я понимаю, что верно следующее и единственные значимые различия между двумя вышеупомянутыми блоками:

  • в обоих блоках, реализацияtest.m может использовать внутреннюю переменную helloness, например, ivar
  • в первом блоке, helloness будет существовать для любого класса, который импортирует этот .h, но в остальном он закрыт только для test.m ввторой блок

В первом блоке это технически то, что считается "глобальной переменной" в том, что любой класс, который импортирует это, будет иметь доступ к тому же содержимому helloness?

Что произойдет, если несколько файлов заголовков имеют объявление для helloness, и вы импортируете их все?

Подобно этому, рассмотрите следующую реализацию:

 @implementation AClass

 int food=5;

Здесь,food действует как внутренний iVar, даже если он не был объявлен ни в одном @interface?

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

В вашем первом примере helloness - это глобальная переменная.Это видно по любому файлу, который импортирует этот заголовок.Если вы включите несколько заголовков, которые также объявляют переменную int helloness, я думаю, вы получите предупреждение от компилятора, и все они будут указывать на одну и ту же область памяти.Если вы включите другой заголовок, который объявляет helloness типа, отличного от int, я полагаю, вы получите ошибку компилятора.

Во втором примере helloness равно переменная экземпляра (ivar).Его значение (место в памяти) зависит от каждого экземпляра AClass.(Все может получить к нему доступ: например, AClass *instance = [[AClass alloc] init]; instance->helloness = 7; Однако прямой доступ к ivars в ObjC обычно исключается - вместо этого мы используем методы доступа и / или свойства.)

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

2 голосов
/ 16 марта 2012

В вашем первом примере helloness - это глобальная переменная. Во втором примере это переменная экземпляра.

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

Наличие глобальной переменной в заголовочном файле, как я полагаю, вы делаете в первом примере, поскольку вы ссылаетесь на #import, это, вероятно, плохая идея. Если это не предварительное определение, как у вас (например, если вместо этого у вас было int helloness = 12;), вы получите многозначно определенные ошибки символов во время ссылки.

В последнем примере food все еще является глобальной переменной, но, поскольку она, скорее всего, находится в файле реализации (а не в заголовке), вы, вероятно, не столкнетесь с какими-либо многократно определенными ошибками символов. Однако не будет работать как переменная экземпляра - это все еще глобальная переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...