为什么registerDefaults中的setValue会给BOOL YES一个警告?

时间:2011-11-14 03:01:40

标签: objective-c ios

我的代码中有以下几行:

[registerDefaults setValue:NO forKey:UserDefaultsGameSortAscendingKey];
[registerDefaults setValue:YES forKey:UserDefaultsReminderSortAscendingKey];

为什么我在第二行而不是第一行收到警告?

  

不兼容的整数到指针转换

UserDefaultsGameSortAscendingKeyUserDefaultsReminderSortAscendingKey都定义为常量:

extern NSString *const UserDefaultsGameSortAscendingKey;
extern NSString *const UserDefaultsReminderSortAscendingKey;

3 个答案:

答案 0 :(得分:4)

您需要将BOOL包装为NSNumbers以将它们存储为默认值:

[registerDefaults setValue:[NSNumber numberWithBool:NO] forKey:UserDefaultsGame...];
[registerDefaults setValue:[NSNumber numberWithBOOL:YES] forKey:UserDefaultsGame...];

答案 1 :(得分:2)

您应该使用setBool:forKey:。这将消除警告(@ isaac的答案解释了原因),节省了编写代码的时间,并且因为为您完成任何转换/转换而不易出错:

[registerDefaults setBool:NO forKey:UserDefaultsGameSortAscendingKey];
[registerDefaults setBool:YES forKey:UserDefaultsReminderSortAscendingKey];

From the NSUserDefaults Docs

setBool:forKey:
     

将指定的默认键的值设置为指定的布尔值   值。

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName
     

value
  要存储在默认数据库中的布尔值。

     

defaultName
  与值相关联的关键。

答案 2 :(得分:0)

是的,正如其他人指出的那样,你应该使用setBool:forKey:或将BOOL包装在NSNumber中。现在回答你的实际问题:

setValue:forKey:定义为:

- (void)setValue:(id)value forKey:(NSString *)key

value是id类型,它是指向任何类型对象的指针。 NO计算结果为0或nil,这是id(或任何指针)类型的变量的有效版本。 YES计算结果为1,这不是id类型变量的有效值。因此警告。

相关问题