“发送const NSString *'到'NSString *'types的参数会丢弃qualifiers”警告

我有常量NSString,我想调用像:

[newString isEqualToString:CONSTANT_STRING]; 

这里有错误的代码吗?

我得到了这个警告:

向'NSString *'types的参数发送'const NSString *'会丢弃限定符

应如何申报?

你应该声明你的常量string如下:

 NSString * const kSomeConstantString = @""; // constant pointer 

代替:

 const NSString * kSomeConstantString = @""; // pointer to constant // equivalent to NSString const * kSomeConstantString = @""; 

前者是一个指向NSString对象的常量指针,而后者是指向常量NSString对象的指针。

使用NSString * const可以防止您重新指定kSomeConstantString指向不同的NSString对象。

方法isEqualToString:需要一个NSString *types的参数。 如果你将一个指针传递给一个常量string( const NSString * ),那么你传递的是与预期不同的东西。

此外, NSString对象已经是不可变的,所以使它们成为const NSString是没有意义的。

只是把所有在一个地方发现在各种职位上的stackoverflow和为我工作,#定义是坏的,因为你不能从variablestypes中受益,基本上编译器replace所有发生时编译(只要你需要导入Constants.h):

 // Constants.h #import <Foundation/Foundation.h> @interface Constants : NSObject extern NSString *APP_STATE_LOGGED_IN; extern NSString *APP_STATE_LOGGED_OUT; @end // Constants.m #import <Foundation/Foundation.h> #import "Constants.h" @implementation Constants NSString *APP_STATE_LOGGED_IN = @"APP_STATE_LOGGED_IN"; NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT"; @end 

请花几分钟时间阅读本文。 指针地狱常数,反之亦然。

http://c-faq.com/decl/spiral.anderson.html