建立全局字符串数组

时间:2014-01-21 15:50:18

标签: ios nsarray

在我的应用程序中,我从许多不同的视图控制器中引用了许多相同的字符串变量,并且我使用此方法创建了许多全局NSString

OpeningController.h (在@interface之前)

extern NSString *stringName;

OpeningController.m (在@interface {} @end之后)

NSString *stringName =@"On";

然后我可以在我的应用程序的任何地方引用/ alter stringName

我希望能够对字符串数组执行相同的操作,但是当我尝试以下操作时,我会收到错误 Initializer不是编译时常量

我如何实现我想要实现的目标?

OpeningController.h

extern NSArray *arrayName;

OpeningController.m (在@interface {} @end之后)

NSArray *arrayName = [NSArray arrayWithObjects:
                     @"String1",
                     @"String2",
                     @"String3",
                     @"String4",
                     nil];

3 个答案:

答案 0 :(得分:2)

假设openingController是一个类名(提示:它应该是OpeningController),那么你可以在类+initialize方法中初始化数组,该方法将在类中尽快调用在运行时引用:

OpeningController.m:

#import "OpeningController.h"

NSArray *arrayName = nil;

@implementation OpeningController

+ (void)initialize {
    arrayName = [NSArray arrayWithObjects:
                @"String1",
                @"String2",
                @"String3",
                @"String4",
                nil];
}

....

@end

编辑:请注意,这不是一个特别好的示例,因为在没有引用OpeningController的情况下引用数组将首先访问未初始化的数组。更好的方法是单例模式:

OpeningController.h:

@interface OpeningController : UIViewController  // Not sure of the subclass

+ (NSArray *)array;

...

@end

OpeningController.m:

#import "OpeningController.h"

@implementation OpeningController

+ (NSArray *)array {
    static NSArray *array = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        array = [NSArray arrayWithObjects:
                @"String1",
                @"String2",
                @"String3",
                @"String4",
                nil];
    });
    return array;
}

...

@end

答案 1 :(得分:1)

不要使用共享的全局变量。它们在您的不同类之间创建非常强大的耦合,并强制各种相互依赖。这很快导致了意大利面条代码。

而是创建一个数据容器单例。这是一个单例对象(对Objective C中的单例设计模式进行谷歌搜索,甚至是搜索),其中包含您要共享的属性。

然后,只要您想要读取或写入全局变量,就可以使用单例的访问器方法来获取单例,然后调用所需的属性。

NSUserDefaults是Apple框架中单身人士的一个例子。代码

[NSUserDefaults sharedUserDefaults]是一个类方法调用,它返回一个指向用户默认单例的指针。

您的代码可能类似于[MyDataSingleton sharedDataSingleton]

答案 2 :(得分:0)

您必须限制数组,否则它将无效。

您可以创建该类的实例,并在每次需要时获取该实例。

如果您有任何疑问,请告诉我:)