带#define的常量字符串数组 - objective c

时间:2012-05-09 14:25:01

标签: objective-c ios

我需要一个常量中的字符串数组。使用#define是个好主意吗?

例如:

#define rows [NSArray arrayWithObjects:  @"NameRowA",@"NameRowB",@"NameRowC", nil]


#define KEY_ROWA [columnas objectAtIndex:0]
#define KEY_ROWB [columnas objectAtIndex:1]
#define KEY_ROWC [columnas objectAtIndex:2]

我需要访问字符串数组和该数组的元素。

我已经读过,(我不知道是不是真的)用这种方式创建一个新的NSArray,当它被使用时,我想这个数组被释放了,所以我认为这很好,因为你只使用它你需要它时的一部分记忆。

2 个答案:

答案 0 :(得分:7)

使用单例,它只是几行代码。 您只需要一个静态单例,以及一个用于检索它的静态方法(并设置一次)。

您的.m文件应包含以下内容:

@implementation MyClass 

static NSArray *mySingletonArray; // this will be your array

+ (NSArray *)mySingletonArray // this is the static method for accessing your array
{
    if (nil == mySingletonArray) {
        mySingletonArray = [NSArray arrayWithObjects:@"firstString", @"secondString", nil];
    }

    return mySingletonArray;
}

使用静态访问方法[MyClass mySingletonArray]从数组中获取所需内容,例如

NSLog("%@", [[MyClass mySingletonArray] objectAtIndex:0]);

答案 1 :(得分:6)

我认为您不想使用#define

在您的示例中,没有使用此代码生成的常量字符串数组。每次在代码中使用rows时,都会分配一个新的NSArray。此外,KEY_ROWA引用了columnas,但这不在行的define中。我假设你有这样的东西

NSArray *columnas = rows;

它和

之间确实没有区别
NSArray *columnas = [NSArray arrayWithObjects: @"NameRowA",@"NameRowB",@"NameRowC", nil];

但第二行更为明显。 KEY_ROWA也是如此 - objectAtIndex调用会更明显,宏不会给你任何东西。

我不确定你需要什么,但是如果你需要一个类中的共享常量字符串数组,你可以在开头将它声明为+而不是-,并且分配一次(这是一个类变量而不是实例变量)。更多信息:

How do I declare class-level properties in Objective-C?