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