我使用NSUSerDefaults来存储用户偏好.我记得在某个地方读到,将键设置为常量是个好主意——我同意.以下代码是我目前拥有的:

[[NSUserDefaults standardUserDefaults]
        setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
           forKey:@"polygonNumberOfSides"];

我试着把它改成:

@implementation Controller

NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";

-(void)savePolygonInfo {
    [[NSUserDefaults standardUserDefaults]
            setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
               forKey:kPolygonNumberOfSides];
}

虽然这确实有效,但它会产生"warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type".我希望我的代码不受编译器警告的影响.如何修复此警告?

推荐答案

你应该使用:

NSString * const kPolygonNumberOfSides = @"..."; // const pointer

而不是:

NSString const * kPolygonNumberOfSides = @"..."; // pointer to const

第一个是指向NSString对象的常量指针,而第二个是指向常量NSString对象的指针.

这是一个微妙的区别.编译器发出警告是因为setObject:forKey:声明如下:

- (void)setObject:(id)value forKey:(NSString *)defaultName;

它希望defaultName参数的类型为NSString *.当你传递一个指向常数的指针时,你给了它一些不同的东西.

Update:我想指出的是,如果这些常量只在单个文件中使用,那么它们应该被定义为static.我这样说是因为我自己也遇到过这个问题:如果不将它们声明为静态,那么它们将存在于全局名称空间中,并且不能在另一个文件中使用具有相同名称的变量.更多信息请参见Constants in Objective-C.举例来说,这就是我目前使用的密钥,我只需要在一个.m文件中使用:

static NSString * const kSomeLabel = @"...";

Objective-c相关问答推荐

单例实例与类方法

UITextField secureTextEntry 带有自定义字体的项目符号?

Objective C 中的多个委托

Objective C中的简单字符串连接

我需要在 ARC 中使用 dealloc 方法吗?

为什么在目标 c 的静态上下文中允许 self

自动布局和按下时隐藏底栏

不区分大小写的核心数据 CONTAINS 或 BEGINS WITH 约束

如何为图层 shadowOpacity 设置动画?

自定义 UISwitch 和 App Store 批准

xcode storyboard Container View - 如何访问视图控制器

如何保存我的 iPhone 应用程序的用户首选项?

[NSNull null] 和 nil 有什么区别?

从昨天开始无法将存档上传到应用store

动画 UIButton 状态变化

当用户点击文本字段外的其他区域时如何关闭键盘?

如何在 UIImageView 中显示 base64 图像?

发送通知到山狮通知中心

字符串常量和字符串文字有什么区别?

ld:找不到文件:链接器命令失败,退出代码为 1