Хлоп!У вас есть все виды проблем.
Вы должны вернуться к чертежной доске и прочитать некоторые вещи.
Если вы используете stringWithFormat, вы должныпередать строку формата, которая почти всегда будет строковым литералом.Если переменная, которую вы передаете в качестве аргумента, содержит символы в процентах, ваша программа вылетит.
Char - это целочисленный тип, поэтому вы должны хранить его как NSNumber или использоватьудобный метод: - [NSUserDefaults setInteger: forKey:].
userDefaults = gameDict не делает то, что вы думаете.userDefaults - это указатель и локальная переменная.Это не назначение пользователя по умолчанию.Вы должны понимать указатели и язык C.
Полученные предупреждения сообщат вам о проблемах.Убедитесь, что вы их понимаете.
Я не понимаю, почему вы инициализируете словарь с некоторыми значениями, а затем пытаетесь установить их заново.В любом случае, чтобы внести изменения в словарь, он должен быть изменяемым, то есть экземпляром NSMutableDictionary.
Это должен быть "gameLoopSpeed", а не "theGameLoopSpeed".
Это должно выглядеть примерно так:
NSUserDefaults *dflts = [NSUserDefaults standardUserDefaults];
[dflts setInteger:score forKey:@"gameScore"];
[dflts setObject:sound forKey:@"gameSound"];
[dflts setFloat:gameLoopSpeed forKey:@"gameLoopSpeed"];
…
И вызов синхронизации требуется только в том случае, если ваша программа вскоре ненормально завершит работу, что в вашемДело, судя по тому, что я только что видел, наверное, будет.; -)