“向'NSString *'类型的参数发送'const NSString *'会丢弃限定符”警告


353

我有常量NSString,我想这样调用:

[newString isEqualToString:CONSTANT_STRING];

这里有任何错误的代码吗?

我收到此警告:

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

这些应该如何声明?


2
如何定义这些字符串?

Answers:


916

您应按以下方式声明常量字符串:

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

代替:

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

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

使用a NSString * const可防止您将kSomeConstantString重新分配为指向其他NSString对象。

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

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


3
您说前者是指向NSString对象的常量指针。因此,这意味着指针是恒定的。因此,我无法将其重新分配给另一个NSString。
user4951 2011年

8
希望我能给你十票!感谢您的理解且很有帮助的答案!
君士坦丁·萨鲁哈斯

1
地球上的NSString * const是如何指向NSString的const指针?他们的上下文无关语法生成器是什么?
user4951 2012年

3
@Jim问题在于您没有正确学习C语言,不要将其归咎于他人。该const限定适用于在它的左边期限,并将其应用到其右边的名词而已,如果有什么在其左侧(如const char *char const *是非const的指针为const char,不过char *const是一个const指针不为const char )。

8
+1。+1000表示“此外,NSString对象已经是不可变的,因此使它们成为const NSString是没有意义的。”
Madbreaks

6

只是将所有内容放在一个可以在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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.