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

xar*_*rly 3 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]
Run Code Online (Sandbox Code Playgroud)

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

我已经读过了,(我不知道是不是真的)用这种方式创建一个新的NSArray,当它被使用时,我想这个数组已经发布了,所以我认为这很好,因为你只使用那部分内存什么时候需要它.

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

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

NSLog("%@", [[MyClass mySingletonArray] objectAtIndex:0]);
Run Code Online (Sandbox Code Playgroud)


Lou*_*nco 6

我不认为你想用#define它.

在您的示例中,没有使用此代码生成的常量字符串数组.rows在您的代码中使用每一次,将分配一个新的NSArray.此外,KEY_ROWA引用columnas,但不在行define中.我猜你有类似的东西

NSArray *columnas = rows;
Run Code Online (Sandbox Code Playgroud)

这和之间确实没有什么区别

NSArray *columnas = [NSArray arrayWithObjects: @"NameRowA",@"NameRowB",@"NameRowC", nil];
Run Code Online (Sandbox Code Playgroud)

但第二行更为明显.同样的情况KEY_ROWA- 对objectAtIndex调用会更明显,宏不会给你任何东西.

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

如何在Objective-C中声明类级属性?