2010-10-19 3 views
6

В моем файле .m для класса с именем Ad, у меня есть 3 статические строкиЦель C - статическая и глобальная переменная?

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

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

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

ответ

16

Вы можете добавить следующие объявления для вашего 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 для использования строк.

+0

Эй, я сделал последнее, не совместимое с ARC, но его можно использовать в ARC, используя методы назначения и указав сильные или слабые ссылки. Это немного ближе к исходному вопросу: https://gist.github.com/darionco/03649feeee57f86fee3f – Dario

8

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

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

extern NSString *AdStateDisabled; 

Вы можете использовать их в других файлах, ну, но вы не получили бы доступ к ним как «Ad.AdStateDisabled», но так же, как «AdStateDisabled».