Как использовать глобальные переменные в Objective-C? - PullRequest
17 голосов
/ 30 июля 2010

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

Ответы [ 4 ]

25 голосов
/ 30 июля 2010

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

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

extern int GlobalInt;

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

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

int GlobalInt = 4;

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

Однако


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

13 голосов
/ 30 июля 2010

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

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

В вашем заголовке:

extern NSString *someString;
extern NSInteger someInteger;

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

NSString *someString = @"DEFAULT_VALUE";
NSInteger someInteger = DEFAULT_VALUE;
2 голосов
/ 31 июля 2010

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

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

Это может быть реализовано несколькими способами, но я использую одноэлементный метод и просто заставляю статические методы вызывать один экземпляр класса устройства. Например, в моем проекте 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, чтобы он автоматически включался во все мои файлы.

0 голосов
/ 13 декабря 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...