Цель C - Как использовать внешние переменные? - PullRequest
10 голосов
/ 05 декабря 2010

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

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

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

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

.h
extern NSNumber const *MoveID;

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

Ответы [ 4 ]

15 голосов
/ 05 декабря 2010

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

.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;
    }
}
3 голосов
/ 05 декабря 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
2 голосов
/ 05 декабря 2010

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


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

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

0 голосов
/ 11 марта 2014

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

в .ч

extern NSNumber *MoveID;

дюйм. М

NSNumber *MoveID;

...

- (void)viewDidLoad {
    [super viewDidLoad];

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

    ...
}

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

...