"发送 'const NSString *'到“NSString *”类型的参数丢弃限定符”警告
我有常量 NSString,我想这样调用:
[newString isEqualToString:CONSTANT_STRING];
这里有错误的代码吗?
我收到这个警告:
将“const NSString *”发送到“NSString *”类型的参数会丢弃限定符
这些应该如何声明?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您应该按如下方式声明常量字符串:
而不是:
前者是指向
NSString
对象的常量指针,而后者是指向常量NSString
对象的指针。使用 NSString * const 可以防止您重新分配 kSomeConstantString 以指向不同的 NSString 对象。
方法 isEqualToString: 需要一个 NSString * 类型的参数。如果您传递一个指向常量字符串 (
const NSString *
) 的指针,则您传递的内容与预期不同。此外,
NSString
对象已经是不可变的,因此将它们设置为const NSString
是没有意义的。You should declare your constant string as follows:
instead of:
The former is a constant pointer to an
NSString
object, while the latter is a pointer to a constantNSString
object.Using a
NSString * const
prevents you from reassigning kSomeConstantString to point to a differentNSString
object.The method
isEqualToString:
expects an argument of typeNSString *
. If you pass a pointer to a constant string (const NSString *
), you are passing something different than it expects.Besides,
NSString
objects are already immutable, so making themconst NSString
is meaningless.只是为了将所有内容放在一个地方,该位置在 stackoverflow 上的各种帖子上找到并且对我有用,#define 很糟糕,因为您无法从变量类型中受益,基本上编译器会在编译时替换所有出现的情况(每当需要时导入 Constants.h):
just to put all on one place which found on various post on stackoverflow and works for me , #define is bad because you cannot benefit from variable types, basically the compiler replaces all occurrence when compiles (import Constants.h whenever you need) :
抽出几分钟时间阅读本文。关于指针的好读物对常量来说是地狱,反之亦然。
http://c-faq.com/decl/spiral.anderson.html
spare few minutes to read this. A goodread on pointers hell on constants and vice-versa.
http://c-faq.com/decl/spiral.anderson.html