Как использовать глобальные переменные в Objective-C?

Как объявить глобальную переменную в моем проекте Objective-C?

Ответ 1

Традиционно глобальные переменные объявляются в заголовке и определяются в исходном файле. Другие исходные файлы должны знать только, как объявлено использовать его (т.е. Его тип и его имя). Пока переменная определена где-то в исходном файле, компоновщик сможет найти ее и соответствующим образом связать все ссылки в других исходных файлах с определением.

Где-то в вашем заголовке вы бы объявили глобальную переменную следующим образом:

extern int GlobalInt;

Часть extern сообщает компилятору, что это всего лишь объявление о том, что существует объект типа int, идентифицированный GlobalInt. Он может быть определен позже или не может (это не ответственность компилятора, чтобы обеспечить его существование, то есть работу компоновщика). Это похоже на прототип функции в этом отношении.

В одном из ваших исходных файлов вы определяете целое число GlobalInt:

int GlobalInt = 4;

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

Однако


Вам следует подумать, полезен ли этот подход. Глобальные переменные становятся беспорядочными по нескольким причинам (пытаясь выяснить, где именно они определены или объявлены, проблемы с потоками), обычно нет необходимости в глобальных переменных. Возможно, вам стоит подумать об использовании одноэлементного подхода.

Ответ 2

Не используйте. Глобальные переменные часто являются признаком плохого дизайна. Общей заменой в Objective-C является метод класса, который возвращает объект (который может быть или не быть одиночным), например [NSUserDefaults standardUserDefaults] или [UIDevice currentDevice].

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

В заголовке:

extern NSString *someString;
extern NSInteger someInteger;

В вашем файле реализации:

NSString *someString = @"DEFAULT_VALUE";
NSInteger someInteger = DEFAULT_VALUE;

Ответ 3

В моем опыте есть несколько случаев, когда программе не нужны, по крайней мере, какие-то данные или утилиты/вспомогательные методы, к которым можно получить доступ во всей программе.

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

Он может быть реализован несколькими способами, но я использую singleton и просто передаю статические методы одному экземпляру класса устройства. Например, в моем проекте Oovium у меня есть:

Oovium.h:

@interface Oovium : NSObject {
    UIWindow* _window;
}

+ (UIWindow*) window;

Oovium.m:

@implementation Oovium

static Oovium* oovium;

- (UIWindow*) window {return _window;}

+ (void) initialize {
    oovium = [[Oovium alloc] init];
}

+ (UIWindow*) window {return [oovium window];}

Затем я включаю Oovium.h в свой файл Oovium_Prefix.pch, чтобы он автоматически включался во все мои файлы.

Ответ 4

Глобалс рок! Я не знаю, чего все боятся. Я использовал их здесь успешно.

Передача данных между диспетчерами просмотров

Также используется UIStepper для настройки значений в другом viewController. Я мог видеть, что их проблема - это более крупные программы, и, на мой взгляд, одноэлементная вещь - всего лишь маска в глобальном масштабе. Держите его простым, если ваше приложение простое.