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

use*_*951 343 warnings constants objective-c nsstring

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

[newString isEqualToString:CONSTANT_STRING];
Run Code Online (Sandbox Code Playgroud)

这里有错误的代码吗?

我收到了这个警告:

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

这些如何宣布?

alb*_*amg 901

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

NSString * const kSomeConstantString = @""; // constant pointer
Run Code Online (Sandbox Code Playgroud)

代替:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 我希望我能给你十个赞成票!感谢您的理解和非常有用的答案! (8认同)
  • +1.并且+1000 for*"此外,NSString对象已经是不可变的,因此将它们设为const NSString是没有意义的."* (8认同)
  • @albertamg:天才! (5认同)
  • 你说前者是指向NSString对象的常量指针.这意味着指针是常量.因此,我无法将其重新分配给另一个NSString. (3认同)
  • @Jim问题在于你没有正确学习C,不要责怪别人.`const`限定符适用于其左边的术语,只有在左侧没有任何内容时它才适用于右边的术语(例如`const char*`和`char const*`是非const指针const char,但是`char*const`是一个指向非const char的const指针. (3认同)

fre*_*ng_ 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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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