const NSString *'参数类型为'丢弃qualifiers"警告

我有一个常量NSString,我想调用它

[newString isEqualToString:CONSTANT_STRING];

这里有错误代码吗?

我得到了这样的警告:

发送'const NSString *'到类型为'NSString *'的参数,丢弃限定符

这些应该如何声明?

61085 次浏览

你应该这样声明你的常量字符串:

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没有意义。

只是把所有的东西放在一个地方,在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

抽出几分钟来读读这篇文章。指针很好用,常量很好用,反之亦然。

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