const关键字在变量声明中定位的意义

And*_*ill 13 const constants objective-c keyword compiler-warnings

定位的意义是什么?

const
Run Code Online (Sandbox Code Playgroud)

在Objective-C中声明变量时的关键字,例如:

extern const NSString * MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)

extern NSString * const MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)

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

ezo*_*zod 14

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

记住这个的一个简单方法是看看*它的位置; 它左边的所有内容都是"指针"类型,它右边的所有内容都描述了指针的属性.

  • 没有人使用`const NSString*blah`,因为即使是不可变的NSString也可能需要操纵它的ivars(例如,缓存),而NSString也可能是NSMutableString.你使用`NSString*const blah`,这样你的其他一些代码就不会做`if(MY_CONST_STRING = local_string)`而且恶意插件不能把你所有的常量重写为`@"I LIKE MONKEYS"`. (4认同)
  • ezod是正确的 - 但是,当NSString被声明为字符串常量时,我​​没有看到添加const的原因.你不能发布一个NSString,你不能改变它(它不可变)...所以为什么甚至打扰w/const? (2认同)

小智 7

extern const NSString * MY_CONSTANT; 
Run Code Online (Sandbox Code Playgroud)

- 指针是可变的,但指针指向的数据是常量.

 extern NSString * const MY_CONSTANT; 
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*odd 5

通常,const始终适用于之前的令牌const.在第二种情况下,const意味着指针是常量,而不是指向的东西.例外情况是const在第一个例子中出现在可以有意义地保持不变的任何事物之前.在这种情况下,它适用于第一种类型,在这种情况下NSString,它等同于extern NSString const * MY_CONSTANT