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

[newString isEqualToString:CONSTANT_STRING];

这里有错误代码吗?

我得到了这样的警告:

发送'const NSString *'到类型为'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

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

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