2009-10-25 65 views
4

我仍然不确定我是否确定我完全是了解这种特殊情况应该如何解决。所以如果我想声明一个不会改变的NSString数组,这是正确的吗?将常量正确性与静态const指针数组相混淆

static NSString * const strings[] = {@"String 1", @"String 2", ...}; 

是否需要static? (它是做什么的?)我在某处丢失了一个额外的const?它有太多的地方去!尔加!我做错了,还是我只是偏执狂?

回答

7

你有什么:

static NSString * const strings[] = {@"String 1", @"String 2", ...}; 

是不可改变的指针数组。

你可能想:

static NSString const *strings[] = {@"String 1", @"String 2", ...}; 

指针数组到不可变NSString对象。

或者

static NSString const * const strings[] = {@"String 1", @"String 2", ...}; 

不可改变指针数组以不可变NSString对象。

"Clockwise-Spiral Rule"是我用来解释C声明的技术。

static关键字表示数组的“存储时间”是整个程序的整个生命周期。如果声明在一个函数中,那么函数返回时该数组不会消失(尽管该范围仍将仅用于该函数)。如果声明在文件范围内,则static关键字将使数组的名称仅在该编译单元(即源文件)中可见。另一个源文件无法通过extern声明访问该数组。

+2

也许更好的表述为“一个不变的指针数组”,“一个不可变的指针数组”,“指向不可变对象的指针数组”,或者哪个最适合。 – Tordek 2009-10-25 05:08:44

+0

@Tordek - 感谢您的改进建议。 – 2009-10-25 05:11:15

+0

+1顺时针螺旋规则 – BobbyShaftoe 2009-10-25 05:38:06

1

您从内向外阅读C声明,首先向右移动到像[]这样的高度绑定的运算符,然后向左移动。所以,你有:字符串,一个数组,指向NSString的常量指针,它是静态的。

这是完全合理的,但不是你说的你想要的。

要创建指向常量字符串的指针,您需要*另一侧的const,因此您将拥有指向静态常量NSString的指针数组。

如果需要,您可以将const放在两个地方。使用static存储类有点像定义一个类变量。它与C99中的static相同,这是一个模块级别的词法范围。

+1

Objective-C没有类变量。我们可以获得与.m文件中定义的静态存储的类变量相同的效果,但请不要忽略差异。 – NSResponder 2009-10-25 06:14:56