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

368

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

[newString isEqualToString:CONSTANT_STRING];

这里有什么错误的代码吗?

我收到了这个警告:

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

应该如何声明这些变量?


2
这些字符串是如何定义的? - user756245
3个回答

956

你应该按照以下方式声明常量字符串:

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


3
你说前者是指向NSString对象的常量指针。这意味着该指针是常量。因此我不能将其重新分配给另一个NSString对象。 - user4951
9
我希望我能给你十个赞!谢谢你简明易懂且非常有用的回答! - Constantino Tsarouhas
1
NSString * const 如何成为 NSString 的常量指针?它们的上下文无关文法生成器是什么? - user4951
7
@Jim,问题出在你没有好好学习C语言,不要把责任推给别人。const这个修饰符作用于它左边的项,并且只有当它左边的项为空时,它才会作用于右边的项(例如,const char *char const * 是指向常量字符的非常量指针,但 char *const 是指向非常量字符的常量指针)。 - user529758
10
+1. 此处的 +1 可能表示同意或支持某个观点。 +1000 for "Besides, NSString objects are already immutable, so making them const NSString is meaningless."此句话的意思是,“另外,NSString对象已经是不可变的了,因此将它们声明为const NSString是没有意义的。” - Madbreaks
显示剩余6条评论

6

6

这里将来自 Stack Overflow 的各种帖子中对我有用的东西放在一起,#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接