我有常量NSString,我想称之为:
[newString isEqualToString:CONSTANT_STRING];
这里有错误的代码吗?
我收到了这个警告:
将'const NSString *'发送到'NSString *'类型的参数会丢弃限定符
如何宣布这些?
答案 0 :(得分:888)
您应该按如下方式声明常量字符串:
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
变为毫无意义。
答案 1 :(得分: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
答案 2 :(得分:4)
请花几分钟时间阅读本文。关于常量指针的好读,反之亦然。