2012-01-10 2 views
12

Как объявить переменную в файле main.m так, чтобы она была доступна во всех классах?object-c - global variables

Если я просто объявляю его в функции main, компилятор говорит, что он не объявлен в методе класса.

Должен ли я объявить об этом в виде объекта?

@public 
type variable; 

ответ

25

Все что вам нужно, это использовать простые старые глобальные переменные C.

Во-первых, определить переменную в вашем main.m, перед вашей main функции:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

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

// .h file 

// Declaration of your variable.  
extern type variable; 

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

Чтобы сделать вещи ясно: каждая переменная может быть объявлена ​​ несколько раз (Декларация говорит, что эта переменная существует где-то), но определяется только один раз (определение фактически создает память для этой переменной).

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

+0

Имо, глобальные переменные на самом деле сделать много смысла в Objective C, учитывая тенденцию много вещей, естественно, синглтонов, особенно контроллеров просмотра. В этом случае они действуют скорее как константы, чем переменные. – devios1

+0

На самом деле синглтоны используют глобальную переменную - общий экземпляр - таким образом, делая каждого члена глобальным; вы заменяете только одну глобальность другим. – Cristik

10

Не уверен, почему вы хотите это сделать, но можете, если хотите.

main.m:

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m:

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

Но, пожалуйста, подумайте, прежде чем приступать, используя что-то вроде этого!

+0

Зачем быть осторожным? Я не понимаю, каков будет риск – Sirens

+1

Риск - это недопустимый код или, возможно, трудно отследить ошибки. – mattjgalloway

+0

Каждый столбец, который я вижу в Интернете о глобальных варсах, имеет предупреждения о «осторожности», а некоторые другие говорят «зачем быть осторожным?». Ха-ха, это всегда один и тот же джаз. Люди, которые не хотят быть осторожными: думайте, что должна быть скрытая причина, по которой другие люди предупреждают вас снова и снова;) – tothemario

2

Помимо отладки, я не вижу причин даже пытаться изменить файл main.m, чтобы напрямую взаимодействовать с вашей логикой приложения.

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

Чтобы узнать больше о постоянных и статических переменных, перейдите по этой ссылке:

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

Но это не сработает, если вам нужен доступ для чтения в var. E. g. если вы хотите сохранить пароль или идентификатор сеанса, доступный для всех классов. –

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