NSArray
我已经像下面这样声明了常量。
static NSArray* const myArray = [NSArray arrayWithObjects:@"obj1",@"obj2",@"ibj3",@"obj4",@"obj5",nil];
但它显示错误“Initiliser 元素不是编译时间常数”。所以我这样声明。但我得到了错误。
请帮助这个案例。
谢谢。
由于NSArrays
是堆分配的对象,因此您不能在静态上下文中创建它们。您可以声明变量,然后在方法中对其进行初始化。
所以,你可以这样做: -
static NSArray *myStaticArray = nil;
- (void) someMethod
{
if (myStaticArray == nil)
{
myStaticArray = [[NSArray alloc] init...];
}
}
希望对你有帮助。。
我不明白为什么你不能用它来解决你的问题。它是100% 不变的,因为它NSArray
是不可变的,而且它也是100% 静态的。
GlobalConstant.h文件:
#import <Foundation/Foundation.h>
// EDITED : __unused static NSArray *_myGlobalArray;
@interface GlobalConstant : NSObject
+ (NSArray *)myGlobalArray;
@end
GlobalConstant.m文件:
#import "GlobalConstant.h"
@implementation GlobalConstant
+ (NSArray *)myGlobalArray {
static NSArray *_myGlobalArray = nil; // EDITED
@synchronized (_myGlobalArray) {
if (_myGlobalArray == nil) {
_myGlobalArray = [NSArray arrayWithObjects:@"1", @"2", nil]; // here is your array...
}
return _myGlobalArray;
}
}
@end
...并且您的数组将在包含该GlobalConstant.h
文件的每个类中可用,您可以像
NSArray *_globalArray = [GlobalConstant myGlobalArray];
To create the static array you can make use of the initialize
method. This is a special class method that every class has. It is called the first time a class is referenced in any way and before any other code in the class is executed.
static NSArray* myArray = nil;
@implementation SomeClass
+ (void)initialize {
if (self == [SomeClass class]) {
myArray = @[ @"obj1", @"obj2", @"obj3", @"obj4", @"obj5" ];
}
}
// rest of methods
@end
并且,为了节省打字,您可以使用NSArray* myArray = @[ @"obj1", @"obj2", @"ibj3", @"obj4", @"obj5" ];