2009-06-13 3 views
1

есть что-то, что я пытаюсь понять. У меня есть этот объект заявление в моем AppsController-класса для Cocoa ApplicationЗадача-C: Вопрос об объявлении объекта

NSMutableArray *personArray; 

In можно поместить это объявление в файле заголовка или в реализации класса в файле кода. Это не имеет значения. Я могу даже поставить его вне контекста @implementation прямо под командами #import. Приложение работает отлично.

Поскольку я не наследую от класса AppsController или не делаю ничего интересного с этим, мне интересно, какая разница между этими типами объявлений?

В чем заключается эта декларация?

ответ

7

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

@interface AppsController : NSObject 
{ 
    NSMutableArray *personArray; 
} 

Каждый экземпляр класса AppsController будет иметь свою собственную копию переменной personArray, которая отделена от всех других экземпляров класса.

Если, однако, вы определяете переменную вне интерфейса, она становится глобальной переменной, и это общий (экземпляры вашего класса не получают свою собственную копию), и могут быть доступны из любой экземпляр вашего класса. Если вы объявляете его в заголовке, как например:

NSMutableArray *personArray; 

также видны методы в других файлах и классов, которые включают в свой заголовок.

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

Поскольку ваш объект является объектом контроллера, я предполагаю, что у вас есть только один экземпляр этого приложения.Вы должны объявить переменную как:

  1. В качестве переменного экземпляра, если ваша personArray переменного должны быть уникальным для каждого экземпляра вашего класса контроллера (даже если у вас есть только один экземпляр сейчас, вы можете иметь более одного пример его в будущем).
  2. В качестве переменной класса (с использованием ключевого слова static), если вы хотите, чтобы переменная была видимой для всех экземпляров вашего класса, имеет только один, общий экземпляр переменной.
  3. Как глобальная переменная, если вы хотите, чтобы переменная являлась единственным экземпляром (не уникальным для экземпляров вашего класса), а также видимым для других классов или кода в других файлах.
4

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

Я думаю, что если вы поместите его в другое место, он будет рассматриваться как глобальная переменная. То есть, будет только один экземпляр personArray, и он будет виден из любого места вашего приложения.

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

1

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

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

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

отредактирован: исправлена, спасибо Питер

+0

Глобальные переменные явно не объявлены как 'static' не статичны, они внешние (C99 §6.9.2 ¶4). GCC имеет параметр компилятора, который дает этот эффект, делая символы по умолчанию скрытыми видимостью, но обычно не включен, и он не является стандартным. –

Смежные вопросы