【问题标题】:Objective C - How to use extern variables?Objective C - 如何使用外部变量?
【发布时间】:2010-12-05 18:08:52
【问题描述】:

我正在尝试使用外部变量。

它抱怨因为使用 numberWithInt 我没有传递一个 contants 作为我的变量的值

所以我删除了 const 并且它抱怨 extern 变量必须是一个常量,那么这里的解决方案是什么?

我不想使用 INT

.h
extern NSNumber const *MoveID;

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

【问题讨论】:

    标签: objective-c global-variables extern


    【解决方案1】:

    您可以尝试执行以下操作:

    .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;
        }
    }
    

    【讨论】:

    • 请注意 MoveID 的值只有在某处触及 MYGreatClass 类时才会设置。如果有问题,您可以使用+load 方法。
    【解决方案2】:

    正如@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
    

    【讨论】:

      【解决方案3】:

      编辑:我刚刚意识到我完全错过了这个问题,并且正在继续讨论为什么会发生错误,哎呀。不过,我将把答案的第一部分留在这里,因为 Jacob Relkin 在他的回答中引用了它。


      因为[NSNumber numberWithInt:1] 不是编译时常量值,所以不能将用它创建的NSNumber 设置为const 变量。

      似乎有一个关于extern NSNumber consts 的radar,它似乎在Objective-C 中不受支持。我想您可以使用预处理器宏从常量整数或浮点数创建NSNumbers,如in this article 所述。它与您的意图几乎不一样,但似乎非常接近。

      【讨论】:

        【解决方案4】:

        为了完整起见,现代方法是这样做:

        在.h中

        extern NSNumber *MoveID;
        

        在.m

        NSNumber *MoveID;
        
        ...
        
        - (void)viewDidLoad {
            [super viewDidLoad];
        
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                MoveID = @1;
            });
        
            ...
        }
        

        dispatch_once() 只会运行一次,因此初始化程序不会重复,并且是线程安全的。此外,在视图生命周期中将初始化代码向下推。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多