target-c - глобальные переменные

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

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

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

@public
type variable;

person thepepp    schedule 10.01.2012    source источник


Ответы (3)


Все, что вам нужно, это использовать старые глобальные переменные 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.

person iHunter    schedule 10.01.2012
comment
Имо, глобальные переменные на самом деле имеют большой смысл в Objective C, учитывая тенденцию к тому, что многие вещи естественным образом являются синглтонами, особенно контроллеры представлений. В этом случае они больше похожи на константы, чем на переменные. - person devios1; 04.08.2013
comment
На самом деле синглтоны используют глобальную переменную — общий экземпляр — таким образом, каждый элемент становится глобальным; вы только заменяете один вид глобальности другим. - person Cristik; 22.10.2015

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

основной.м:

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);
}

Но, пожалуйста, хорошенько подумайте, прежде чем приступать к использованию чего-то подобного!

person mattjgalloway    schedule 10.01.2012
comment
Зачем быть осторожным? я не понимаю чем это грозит - person Allison; 25.03.2013
comment
Риск будет заключаться в неподдерживаемом коде или, возможно, трудно отслеживаемых ошибках. - person mattjgalloway; 26.03.2013
comment
Каждый пост, который я вижу в Интернете о глобальных переменных, содержит предупреждения о том, что нужно быть осторожным, и некоторые другие люди говорят, зачем быть осторожным?. Ха-ха, это всегда один и тот же джаз. Люди, которые не хотят быть осторожными: подумайте, что должна быть скрытая причина, по которой другие люди снова и снова предупреждают вас;) - person tothemario; 18.08.2014

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

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

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

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

person Rigo Vides    schedule 10.01.2012
comment
Но это не работает, если вам нужен доступ для чтения и записи к var. напр. если вы хотите сохранить пароль или идентификатор сеанса, доступный для всех классов. - person K. Biermann; 27.05.2014