2012-10-09 36 views
0

我有一个全局变量:的NSString常量指针到常量指针

FOUNDATION_EXPORT NSString *const ENGModelItemText; // .h file 
NSString *const XYZConstant1 = @"XYZConstant1"; // .m file 

...我想创建XYZConstant2将指向XYZConstant1。我认为这将是如此简单:

NSString *const XYZConstant2 = &XYZConstant1 

*&起到了一下,但无法得到它的权利。我想为XYZConstant2摆脱#define,我现在使用它。

+0

为什么它们指向完全相同的对象 - 您应该使用'isEqual:'来比较:) – deanWombourne

+0

使用'=='和'const'会更快。 –

+2

如果你追求速度为什么你要使用字符串 - 使用'enum' :) – deanWombourne

回答

1

您不能在C(因此在ObjC)中创建像这样的编译时别名。您可以通过在函数或方法中声明XYZConstant2而不是静态来创建运行时别名。比较这纯粹C,它创建了同样的错误:(另见Compiler error: "initializer element is not a compile-time constant"

const char * const foo; 
const char * const bar = foo; 

通常当需要这种走样(通常是因为字符串常量改名),您可以使用#define (就像我讨厌的定义一样)。这就是说,你不应该依赖于两个对象指针是相同地址的事实,除非你的意思是“它是这个对象”,而不是“它有这个值”。 (你永远不会认为字符串是因为字符串只有值。)写入语义,而不是实现细节。不要过早地优化比较。

+0

感谢您的解释!只是FYI - 我在“NSMapTable”(强指针指向映射)中使用这些指针。也感谢您提供所有其他提示。 –

+0

const char * const不是一个编译时间常量,它是一个推送到堆栈上的变量,它只是一个编译时间,但是它具有内存表示(它的值也可以改变)#define创建一个预先)编译时间常量,不需要任何内存。 –

+0

我以为这是在一个函数里面,我的错。 –

1

这是一个常量,所以编译时间。如果你想指出它,你不能用一个常数。

+0

在声明的范围内,你可以让一个常数到另一个常数。 –

+0

@RamyAlZuhouri,你有没有在ObjC中试过这个?这个答案是正确的。您不能在编译时将静态常量指针指派给另一个静态常量指针。 –

+0

是的,我可以。我试着编译这个代码,用XYZConstant1代替&XYZConstant1,它工作正常。编译错误是因为&XYZConstant1不是指向NSString的指针,而是指向NSString的指针。 –