2016-01-31 40 views
0

我有这个NSUserDefaults设置代码NSUserDefaults的registerDefaults设置初始BOOL - 做的BOOL价值回归的存在是

NSDictionary *appDefaults = [NSDictionary 
          dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"DidBuyInAppPurchase"]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

我检查后,像这样:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DidBuyInAppPurchase"] == YES){//some code} 

这是否意味着BOOL存在对于密钥还是该密钥设置为YES?

奇怪的是,我写了viewDidLoad中的代码,将BOOL设置为YES来测试。在此之前,if-statement没有继续。现在它甚至在我删除将“standardUserDefaults”设置为“YES”的代码时也会执行此操作。即使我删除应用程序并在设备上构建并运行,代码也会继续。

这将表明if检查将YES与boolean值是否存在相比较,并且在某种程度上YES也持久保留在应用程序移除中。然而,应用程序的初始运行也应该抓住这一点,因为存在价值。我检查了这个SO question,似乎if检查应该检查YES值,而不是存在值。

这是针对IAP的 - 当用户购买时,boolean设置为YES以表明它已被购买,如果是,则向用户呈现不同的viewController。如何正确设置此项,以便在检查时将设置为YES执行正确?

编辑:似乎这是在模拟器iOS 8 - 默认情况下没有从应用程序域删除问题。不知道这是iOS 9设备上的情况,还是我错误地使用了NSUserDefaults

+0

在设备上没有看到过问题。请注意,此信息最好存储在钥匙串中,而不是用户的默认值... – Wain

+0

有没有关于域的信息?第一个域是易失性的,所以它不应该持续存在,应用程序域应该在删除应用程序时删除它自己。 – noobsmcgoobs

+0

无论它现在总是返回TRUE,都无法弄清楚 – noobsmcgoobs

回答

0

当您使用-boolForKey:方法时,它在内部做2件事。首先,它为键查找对象,然后尝试从NSNumber对象中解开BOOL(返回BOOL)。

如果该NSNumber不存在,返回将是“否”。如果该NSNumber存在,则返回该对象包装的布尔值。

要检查NSUserDefaults返回NO的原因,可以使用相同的键调用-objectForKey:并简单地测试一个对象的存在。

+0

我将'setBool'方法设置为NO作为测试,但是当我检查来自'boolForKey'的返回值时,我仍然得到YES。似乎没有任何展开。 – noobsmcgoobs

+0

不要忘记随时调用 - 同步。 ;-) – Anticro

+0

哦,我正在同步我的屁股,但仍然不工作 – noobsmcgoobs

0

Apple声明,用于导入预定义设置的方法不会保存任何内容,它只是将字典条目添加到内存默认值。我的小显示屏上没有看到您的整个代码... -registerDefaults: