我仍然不确定我是否确定我完全是了解这种特殊情况应该如何解决。所以如果我想声明一个不会改变的NSString数组,这是正确的吗?将常量正确性与静态const指针数组相混淆
static NSString * const strings[] = {@"String 1", @"String 2", ...};
是否需要static
? (它是做什么的?)我在某处丢失了一个额外的const
?它有太多的地方去!尔加!我做错了,还是我只是偏执狂?
我仍然不确定我是否确定我完全是了解这种特殊情况应该如何解决。所以如果我想声明一个不会改变的NSString数组,这是正确的吗?将常量正确性与静态const指针数组相混淆
static NSString * const strings[] = {@"String 1", @"String 2", ...};
是否需要static
? (它是做什么的?)我在某处丢失了一个额外的const
?它有太多的地方去!尔加!我做错了,还是我只是偏执狂?
你有什么:
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
声明访问该数组。
您从内向外阅读C声明,首先向右移动到像[]这样的高度绑定的运算符,然后向左移动。所以,你有:字符串,一个数组,指向NSString的常量指针,它是静态的。
这是完全合理的,但不是你说的你想要的。
要创建指向常量字符串的指针,您需要*
另一侧的const
,因此您将拥有指向静态常量NSString的指针数组。
如果需要,您可以将const
放在两个地方。使用static
存储类有点像定义一个类变量。它与C99中的static
相同,这是一个模块级别的词法范围。
Objective-C没有类变量。我们可以获得与.m文件中定义的静态存储的类变量相同的效果,但请不要忽略差异。 – NSResponder 2009-10-25 06:14:56
也许更好的表述为“一个不变的指针数组”,“一个不可变的指针数组”,“指向不可变对象的指针数组”,或者哪个最适合。 – Tordek 2009-10-25 05:08:44
@Tordek - 感谢您的改进建议。 – 2009-10-25 05:11:15
+1顺时针螺旋规则 – BobbyShaftoe 2009-10-25 05:38:06