提问



我有常量NSString,我想调用如下:


[newString isEqualToString:CONSTANT_STRING];


这里有错误的代码吗?


我收到了这个警告:



  将const NSString *发送到NSString *类型的参数会丢弃限定符



这些如何申报?

最佳参考


您应该声明您的常量字符串,如下所示:


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


代替:


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


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


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


方法isEqualToString:期望类型NSString *的参数。如果将指针传递给常量字符串(const NSString *),则传递的内容与预期的不同。


此外,NSString对象已经是不可变的,所以使它们const NSString毫无意义。

其它参考1


只是把所有放在stackoverflow上各个帖子上找到的地方并且对我有用,#define很糟糕,因为你不能从变量类型中受益,基本上编译器会在编译时替换所有出现的内容(在需要时导入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

其它参考2


花几分钟时间阅读本文。关于常量的指针地狱,反之亦然。


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