Цель C - Статическая и глобальная переменная? - PullRequest
9 голосов
/ 19 октября 2010

В моем файле .m для класса с именем Ad у меня есть 3 статические строки

static NSString *AdStateDisabled = @"disable";
static NSString *AdStateExpired = @"expired";
static NSString *AdStateActive = @"active";

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

//HomeViewController.m
if ([self.ad.state isEqual:Ad.AdStateDisabled])
{
     //do something
}

Ответы [ 2 ]

18 голосов
/ 19 октября 2010

Вы можете добавить следующие декларации в заголовок HomeViewController.h, которые затем необходимо будет импортировать в любое место, где вам нужен доступ к строкам.

//HomeViewController.h
extern NSString *AdStateDisabled;
extern NSString *AdStateExpired;
extern NSString *AdStateActive;

Затем измените ваши определения, чтобы удалить «статический».

//HomeViewController.m
NSString *AdStateDisabled = @"disable";
NSString *AdStateExpired = @"expired";
NSString *AdStateActive = @"active";

Если вы не хотите, чтобы пользователь строк импортировал HomeViewController.h, вы можете просто определить эти строки в AdState.h и поместить определения в AdState.m (и удалить их из HomeViewController.m) после чего пользователям строки нужно будет просто импортировать AdState.h для использования строк.

9 голосов
/ 19 октября 2010

Сначала снимите статический заряд.Статические переменные и функции в C и Objective-C означают, что они видны только текущему модулю компиляции (то есть более или менее: его может видеть только файл, в котором вы объявили переменную statix).

Далее вам также необходимо объявить переменные в открытом заголовочном файле с помощью «extern», например, класса, связанного с классом:

extern NSString *AdStateDisabled;

Затем вы можете использовать их в других файлах какхорошо, но вы бы не обращались к ним как "Ad.AdStateDisabled", а просто как "AdStateDisabled".

...