2013-03-08 2 views
1

В моих первых ViewControllerViewControllerTest1 У меня есть глобальная переменная, называемая counter. counter должен быть увеличен каждый раз в моем приложении. Все работает отлично:iOS: понимание глобальных переменных

@implementation ViewControllerTest1{ 
int counter = 0; 

-(void)viewDidLoad 
{...} 

-(void)method {...} 
} 

Теперь, если я объявляю другую глобальную переменную counter в моей второй ViewControllerViewControllerTest2 XCode дает мне ошибку.

Я знаю, что могу просто назвать это другим именем, но почему это происходит? Могу ли я убедиться, что в моей памяти находятся только глобальные переменные определенного ViewController?

Или я делаю что-то вроде нет, прямо сейчас, с глобалами, например counter? Есть ли что-то лучше?

+0

Если вы хотите, чтобы глобальная переменная определялась конкретным интерфейсом, тогда сделайте ее членом в том же интерфейсе ... объявите внутренний интерфейс в файле .h – Guru

+0

Код, который вы опубликовали, недействителен. Неверные фигурные скобки. Исправьте их, потому что если закрытие курчавого действительно принадлежит сразу после 'int counter', тогда у вас нет глобального, у вас есть переменная частного экземпляра. – rmaddy

ответ

3

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

Ваше заявление должно выглядеть

static int counter = 0; 

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

+2

На компоновщике, на самом деле. –

+0

Спасибо, я отредактировал свой ответ. – tomahh

+0

Символьный конфликт происходит при связывании. Если два файла объявляют один и тот же символ, возникает конфликт дубликатов символов. Другой способ исправить это - отметить одно объявление как «extern» (которое обычно делается в заголовке, который соответствует файлу реализации, объявляет фактический глобальный). – bbum

0

Если вы определяете переменную в области видимости файла (которая включает в себя определения в пределах определения класса, но вне области ivar или тела метода), по умолчанию она будет иметь ссылку extern, для которой требуются уникальные имена символов.

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

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

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