Вы должны зарегистрировать свои значения по умолчанию, прежде чем пытаться получить доступ к значению, хранящемуся в ваших NSUserDefaults.
Вы можете сделать это за - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
.
Регистрация значений по умолчанию выполняется быстро, поэтому нет необходимости оптимизировать это. Просто сделайте это при запуске приложения.
Я сохраняю свои userdefaults в plist и регистрирую содержимое этого списка, например:
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
Если вы зарегистрируете свои значения по умолчанию, как это, вам не нужно беспокоиться о том, что вы перезаписываете введенные пользователем значения.
NSUserdefaults использует «домены», где он хранит свои значения. Если вы регистрируете свои настройки по умолчанию, они хранятся в домене регистрации. Если пользователь хранит значение, эти значения сохраняются в домене приложения.
Если вы пытаетесь получить значение из NSUserdefaults, он проверяет, присутствует ли значение в домене приложения, и если его нет, оно берет значение из домена регистрации.
Редактировать:
![plist editor](https://i.stack.imgur.com/C51Lq.png)
вы бы получили доступ к этим значениям (или, лучше, к значениям, которые хранятся в ваших nsuserdefaults, и к таким значениям как запасным, если нет пользовательских значений), например:
NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait";
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"];
plist - это просто еще одно представление NSDictionary с ключами и значениями. Ключ - это тот же ключ, который вы используете для доступа к пользовательским ошибкам, а значение - ваше значение по умолчанию.
Довольно прямо вперед.
Неважно, как вы создаете словарь. Вы можете сделать это и в коде.