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

"sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers" warning

提问人:user4951 提问时间:7/26/2011 最后编辑:Dan Rosenstarkuser4951 更新时间:8/31/2017 访问量:62293

问:

我有常量 NSString,我想这样称呼它:

[newString isEqualToString:CONSTANT_STRING];

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

我收到以下警告:

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

这些应该如何申报?

Objective-C nsString 警告 常量

评论

2赞 7/26/2011
这些字符串是如何定义的?

答:

956赞 albertamg 7/26/2011 #1

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

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

而不是:

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

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

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

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

此外,对象已经是不可变的,因此创建它们毫无意义。NSStringconst NSString

评论

3赞 user4951 7/28/2011
您说前者是指向 NSString 对象的常量指针。这意味着指针是恒定的。因此,我无法将其重新分配给另一个 NSString。
9赞 Constantino Tsarouhas 1/3/2012
我希望我能给你十个赞!感谢您的可理解且非常有用的回答!
1赞 user4951 9/9/2012
在地球上,NSString * const 是如何成为指向 NSString 的 const 指针的?他们的上下文无关语法生成器是什么?
7赞 10/11/2012
@Jim问题在于你没有正确学习C语言,不要把它归咎于别人。该限定符适用于其左侧的术语,并且仅当左侧没有任何东西时,它才适用于其右侧的术语(例如 和 a 是指向 const char 的非常量指针,但指向非常量字符的 const 指针)。constconst char *char const *char *const
10赞 Madbreaks 2/19/2014
+1.+1000 表示“此外,NSString 对象已经是不可变的,因此使它们成为 NSString 是没有意义的。
6赞 freezing_ 7/25/2013 #2

只是为了把所有的东西都放在一个地方,在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
6赞 user3693546 12/21/2016 #3

花几分钟时间阅读本文。指针上的好读物,常量见鬼去吧,反之亦然。

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