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

Я пытаюсь использовать внешние переменные.

Он жалуется, что из-за использования numberWithInt я не передаю константы в качестве значения моей переменной

Итак, я удалил const, и он жалуется, что переменная extern должна быть константой, так какие же здесь решения?

Я НЕ ХОЧУ ИСПОЛЬЗОВАТЬ INT

.h
extern NSNumber const *MoveID;

.m
NSNumber const *MoveID = [NSNumber numberWithInt:1];

person aryaxt    schedule 05.12.2010    source источник


Ответы (4)


Вы можете попробовать сделать следующее:

.h

extern NSNumber *MoveID;

.m

NSNumber *MoveID;
@implementation MYGreatClass
+ (void) initialize {
    static bool done = FALSE;
    if(!done){ // This method will be called again if you subclass the class and don't define a initialize method for the subclass
        MoveID = [[NSNumber numberWithInt:1] retain];
        done = TRUE;
    }
}
person beefon    schedule 05.12.2010
comment
Обратите внимание, что значение MoveID не будет установлено до тех пор, пока что-то где-то не коснется класса MYGreatClass. Вы можете использовать метод +load, если это проблема. - person bbum; 05.12.2010

Как сказал @BoltClock, вы не можете установить непостоянное значение типа const.

Что вы могли бы сделать, так это:

extern NSNumber *MoveID;

И...

NSNumber *MoveID;
@implementation SomeClass 
static BOOL loaded = NO;
+ (void) initialize {
   if(!loaded) {
      MoveID = [[NSNumber alloc] initWithInt:1];
      loaded = YES;
   }
}
//blah blah blah

@end
person Jacob Relkin    schedule 05.12.2010

РЕДАКТИРОВАТЬ: я только что понял, что полностью пропустил вопрос и продолжал говорить о том, почему возникает ошибка, упс. Однако я оставлю первую часть своего ответа здесь, потому что Джейкоб Релкин цитирует ее в своем ответе.


Поскольку [NSNumber numberWithInt:1] не является постоянным значением времени компиляции, вы не можете установить NSNumber, созданное с его помощью, в переменную const.

Похоже, существует радар о extern NSNumber consts, который не поддерживается в Objective-C. Я думаю, вы можете использовать макрос препроцессора для создания NSNumbers из постоянных целых чисел или чисел с плавающей запятой, как описано в этой статье< /а>. Это не совсем то, что вы хотели, но кажется довольно близким.

person BoltClock    schedule 05.12.2010

Просто для полноты современный метод делает это как:

in .h

extern NSNumber *MoveID;

in .m

NSNumber *MoveID;

...

- (void)viewDidLoad {
    [super viewDidLoad];

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        MoveID = @1;
    });

    ...
}

dispatch_once() будет запускаться только один раз, поэтому инициализатор не дублируется и является потокобезопасным. Кроме того, опускание кода инициализации ниже в жизненном цикле представления.

person Abizern    schedule 11.03.2014