在Objective-C中,使用#define定义的常量字符串数组

3

我需要一个常量字符串数组,请问使用#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时,当它被使用时,我想它会被释放,所以我认为这很好,因为你只有在需要时才使用那部分内存。


请您检查一下代码片段,好吗?您似乎没有使用“rows”,而“columnas”是什么意思呢? - JeremyP
1
不要这样编程,任何继承你代码的人都可能会试图找到你的地址以及最亲近的人的姓名和电话号码。 “我认为这很好,因为只有在需要时才使用那部分内存。” <- 这是不正确的,#define 只是预编译器的复制粘贴,所以将其放在代码中应该放置的位置是正确的方式。查看这些问题https://dev59.com/1FPTa4cB1Zd3GeqPjXfp,https://dev59.com/B3VD5IYBdhLWcg3wE3bz - Joe
2个回答

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]);

6

我不认为你应该在这里使用#define

在你的例子中,没有用这个代码生成常量字符串数组。每一次在你的代码中使用rows时,都会分配一个新的NSArray。此外,KEY_ROWA指的是列,但在行定义中并不存在。我猜你有类似如下的东西:

NSArray *columnas = rows;

这两者其实并没有什么区别。

NSArray *columnas = [NSArray arrayWithObjects: @"NameRowA",@"NameRowB",@"NameRowC", nil];

但第二行更为明显。对于 KEY_ROWA 也是如此--使用 objectAtIndex 调用会更为明显,并且宏并没有给你带来任何好处。
我不确定您需要什么,但如果您需要在一个类内部共享常量数组,可以在开头将其声明为 + 而不是 -,并分配一次(这是类变量,而不是实例变量)。更多信息请参见此处: 如何在 Objective-C 中声明类级别属性?

感谢您拯救kante0免受糟糕的编码实践之苦。同时也感谢kante0先前的提问,通常如果您在编程过程中感觉有些不对劲,那么很可能就是出了问题。 - Joe
@Lou Franco 非常感谢您的建议。我的意图是创建一个const静态字符串数组,也就是一个字符串数组,没有人能够修改它。但是当我要执行以下操作时:NSLog(@"all rows",rows); NSLog(@"KEY_ROWA %@", KEY_ROWA); NSLog(@"KEY_ROWB %@", KEY_ROWB); NSLog(@"KEY_ROWC %@", KEY_ROWC);对于第一行,我将拥有一个包含所有值(NameRowA,NameRowB,NameRowC)的数组,其余的字符串都带有每个值。非常感谢,纠正是明智之举 :)附注:在第一个代码块中,我指的是“row”,而不是“columna”。 - xarly
你写的每个 NSLog 都将有一个完全不同的对象。它们都等价于彼此,但它们并非静态的。rows 每次使用时都会创建一个新数组。 - Lou Franco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接