意义

2010-01-17 84 views
12

什么是声明在Objective-C的变量时意义

const 

关键字的定位的意义,例如:

extern const NSString * MY_CONSTANT; 

extern NSString * const MY_CONSTANT; 

在赋值中使用第一个版本会产生有关“限定符fr om指针目标类型“被丢弃,所以我假设第二个版本确保指针地址保持不变。不过,我真的很感激一个更明确的答案。提前谢谢了!

回答

13

在第一种情况下,您声明了一个指向不可变对象的可变指针,而在第二种情况下,您声明了一个不可变指针指向可变对象NSString

一个简单的方法来记住这是看看*位于哪里;它左侧的所有内容都是“指针”类型,其右侧的所有内容都描述了指针的属性。

+2

ezod是正确的 - 但是,当NSString被声明为字符串常量时,我​​没有看到添加const的原因。你不能释放一个NSString并且你不能改变它(它不可变)......所以为什么还要打扰到const? – 2010-01-17 21:58:21

+4

没有人使用'const NSString * blah',因为即使一个不可变的NSString可能需要操纵它的ivars(例如,缓存),并且NSString也可能是一个NSMutableString。你使用'NSString * const blah',这样你的其他代码就不会执行'if(MY_CONST_STRING = local_string)',并且一个恶意插件不能将你所有的常量重写为'@“我喜欢MONKEYS”'。 – 2010-10-22 18:01:02

5

一般而言,const总是适用于const之前的令牌。在第二种情况下,const意味着指针是一个常量,而不是指向的东西。在第一个例子中,const出现在任何可能有意义的常量之前时是例外。在这种情况下,它适用于第一类型,在这种情况下NSString,所以其等效于extern NSString const * MY_CONSTANT

+0

我希望我能设置两个被接受的答案,两者都帮助我理解了这一点。非常感谢你们! – 2010-01-17 22:33:35

6
extern const NSString * MY_CONSTANT; 

- 指针是可变的,但由指针指向的数据是不变的。

extern NSString * const MY_CONSTANT; 

- 指针常量,但指针指向的数据不是常量。