【问题标题】:How to define non string constants in objective-C? [duplicate]如何在 Objective-C 中定义非字符串常量? [复制]
【发布时间】:2010-10-25 15:39:06
【问题描述】:

我可以像这样定义全局字符串:

// .h
extern NSString * const myString;

// .m
NSString * const myString = @"String";

现在我需要类似地定义 UIcolor,我该怎么做?

我正在尝试:

// .h
extern UIColor * const myColor;

// .m
UIColor * const myColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];

但这不起作用,我收到error: initializer element is not constant

谢谢

【问题讨论】:

  • 不知道发生这种情况的确切原因,但this question 可能会帮助您找到解决方案。
  • 类别(来自已接受答案中的链接答案)在这里是多余的。请看这个问题:创建字典对象:stackoverflow.com/questions/3855556/…

标签: iphone objective-c constants


【解决方案1】:

您不能使用方法调用(或任何不是编译时常量的表达式)来初始化全局变量。它适用于您的 @"String" 示例,因为这是一个常量表达式。无需调用任何代码来评估它。

【讨论】:

    【解决方案2】:

    不幸的是,字符串是一种特殊情况。对于任何其他类型的对象,您必须首先将其设置为 nil,然后在启动时提供一个值。这样做的一个好地方是在相关类的初始化方法中(不要与实例 init 方法混淆),它保证在类被实例化之前至少被调用一次。 (注意我说“至少一次”;它可能会根据类层次结构再次调用,所以在分配新值之前检查你的全局变量是否为 nil。)

    【讨论】:

    • 具有静态存储持续时间的变量会自动初始化。
    【解决方案3】:

    一件事是:

    static UIColor *DefaultColor = nil;
    
    + (void) initialize {
        static BOOL initiliazed = NO;
        if (initialized)
            return;
        DefaultColor = [UIColor blackColor];
        initialized = YES;
    }
    

    但是如果你只是想初始化一个单一的颜色当然是相当难看的。

    【讨论】:

    • 你可以去掉那个 BOOL 并检查 DefaultColor 是否为 nil。
    • 或使用dispatch_once(),不要费心检查任何东西:)
    • 哦,我不知道dispatch_once,谢谢。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 2015-06-20
    • 2010-11-12
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多