在我的应用程序中,我从许多不同的视图控制器中引用了许多相同的字符串变量,并且我使用此方法创建了许多全局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];
答案 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)
您必须限制数组,否则它将无效。
您可以创建该类的实例,并在每次需要时获取该实例。
如果您有任何疑问,请告诉我:)