Using a constant NSString as the key for NSUserDefaults
我正在使用nsuserdefaults存储用户首选项。我记得在某个地方读到把键设置为常量是个好主意——我同意。以下代码是我目前拥有的代码:
1 2 3 | [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:polygon.numberOfSides] forKey:@"polygonNumberOfSides"]; |
我尝试将此更改为:
1 2 3 4 5 6 7 8 9 | @implementation Controller NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides"; -(void)savePolygonInfo { [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:polygon.numberOfSides] forKey:kPolygonNumberOfSides]; } |
号
虽然这确实有效,但它产生"
您应该使用:
1 | NSString * const kPolygonNumberOfSides = @"..."; // const pointer |
而不是:
1 | NSString const * kPolygonNumberOfSides = @"..."; // pointer to const |
号
第一个是指向nsstring对象的常量指针,而第二个是指向常量nsstring对象的指针。
这是一个微妙的区别。出现编译器警告是因为
1 | - (void)setObject:(id)value forKey:(NSString *)defaultName; |
它期望
更新:我想指出,如果这些常量只在单个文件中使用,那么它们应该定义为
1 | static NSString * const kSomeLabel = @"..."; |
。
不要将
正如E.james所建议的,您可以使用
从其他类访问:
h
1 | extern NSString * const PolygonNumberOfSidesPrefsKey; |
。
m
1 | NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSidesPrefsKey" |
。
仅限当前类内的访问:
m
1 | static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSidesPrefsKey" |
我甚至建议把这个常数做得更具描述性。多边形边数的常数可以来自任何地方。作为一个建议,如何:
1 | kDefaultsPolygonNumberOfSides; |
相反。
关于这个问题的更多背景,有一篇关于维基百科的优秀文章用指针解释常量语法:http://en.wikipedia.org/wiki/const_correction pointers_and_references