2016-01-31 47 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: