19

I try to write/read values to/from [NSUserDefaults standardUserDefaults], but it seems not to work. My code is:

[[NSUserDefaults standardUserDefaults] setObject:@"sampleString" forKey:@"sampleKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *defaultsValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"sampleKey"];
return defaultsValue;

This code returns nil, for Xcode 8.0 beta and iPhone 6s (10.0) simulator. However it returns sampleString for Xcode 8.0 beta and iPhone 6s (9.1) simulator

I am testing my app with the new systems. Am I doing something wrong? Or is there a workaround for that? Or is it just a "beta" issue?

JAL
  • 41,701
  • 23
  • 172
  • 300
antonio
  • 722
  • 11
  • 22
  • This looks alright to me. Check the documentation for NSUserDefaults and see if somethign is new for iOS 10 – Gil Sand Jun 15 '16 at 15:56
  • 1
    What is the deep (practical) sense to read a value back right after writing it? – vadian Jun 15 '16 at 16:00
  • 1
    @vadian thats not my actual code. I basically write at the first launch of the app and read at the second. The sample code is just a testing after i realized it is not working. – antonio Jun 15 '16 at 16:06
  • 3
    [[NSUserDefaults standardUserDefaults] synchronize];... Don't! – Helen Wood Jun 15 '16 at 16:13
  • Can you try setValue forKey ? – Dharmbir Singh Jun 15 '16 at 16:19
  • 9
    Some people are marking this question as a duplicate. It is not. The other question is about an IOS 10 API name change / compile-time problem in Swift. This question is about an Objective-C problem at runtime. – Rob Bajorek Jun 15 '16 at 17:52

4 Answers4

26

I just had the same problem. There seems to be an issue with NSUserDefaults when first running the iOS8 or 9 simulator and then the iOS10 simulator. Rebooting the mac solved the issue for me.

b_ray
  • 696
  • 6
  • 10
  • 2
    Confirmed. Closing and reopening the simulator didn't work, but rebooting fixed it for me. – Rob Bajorek Jun 15 '16 at 16:53
  • You can also use an older simulator as a temporary work around (iOS 9.2 worked for me) – GK100 Jun 22 '16 at 22:16
  • 3
    As per Apple (https://developer.apple.com/library/prerelease/content/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/index.html) WWDC Seed: Running multiple iOS simulators can cause NSUserDefaults to not work Running an iOS 8 or 9 simulator followed by an iOS 10 simulator will cause NSUserDefaults to stop working in the simulator. This can be worked around by rebooting the host Mac. – iHS Jun 25 '16 at 09:48
6

This was a bug with the iOS Simulator that shipped with Xcode 8 Beta 1. It has been fixed in Beta 2:

Resolved in Xcode 8 beta 2 – IDE

Simulator

  • NSUserDefaults function correctly in the iOS 10 Simulator, regardless of whether you have previously booted the iOS 8 or iOS 9 Simulator. (25974372)

Xcode 8 Beta 2 Release Notes

Update to Xcode 8 Beta 2 to avoid having to restart your host Mac every time.

JAL
  • 41,701
  • 23
  • 172
  • 300
3

Update:

If data protection is enabled, synchronize may also fail when an application enter background.


We have this issue on a real device running iOS 10.1.1. Old value could be read, but new change cannot save to disk, synchronize method always fail.

Reboot the device may solve this issue.

BB9z
  • 2,432
  • 1
  • 30
  • 36
1

I just had the same problem. There seems to be an issue with NSUserDefaults when first running the iOS8 or 9 simulator and then the iOS10 simulator. Rebooting the mac solved the issue for me. shareeditflag Confirmed. Closing and reopening the simulator didn't work, but rebooting fixed it for me.

As per Apple (apple link ) WWDC Seed: Running multiple iOS simulators can cause NSUserDefaults to not work Running an iOS 8 or 9 simulator followed by an iOS 10 simulator will cause NSUserDefaults to stop working in the simulator. This can be worked around by rebooting the host Mac.

wg_hjl
  • 535
  • 3
  • 9