2

NSArray我已经像下面这样声明了常量。

static NSArray* const myArray = [NSArray arrayWithObjects:@"obj1",@"obj2",@"ibj3",@"obj4",@"obj5",nil];

但它显示错误“Initiliser 元素不是编译时间常数”。所以我这样声明。但我得到了错误。

请帮助这个案例。

谢谢。

4

4 回答 4

7

由于NSArrays是堆分配的对象,因此您不能在静态上下文中创建它们。您可以声明变量,然后在方法中对其进行初始化。

所以,你可以这样做: -

static NSArray *myStaticArray = nil;

- (void) someMethod
{
  if (myStaticArray == nil)
  {
    myStaticArray = [[NSArray alloc] init...];
  }
}

希望对你有帮助。。

于 2013-01-07T13:52:13.160 回答
4

我不明白为什么你不能用它来解决你的问题。它是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];
于 2013-01-07T16:03:41.163 回答
3

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
于 2013-01-07T14:29:42.877 回答
0

并且,为了节省打字,您可以使用NSArray* myArray = @[ @"obj1", @"obj2", @"ibj3", @"obj4", @"obj5" ];

于 2013-01-07T14:03:13.653 回答