Мне кажется, что вносить изменения в NSUserDefaults внутри обработчика defaultsChanged не очень хорошая идея. Согласно вашему собственному комментарию, это вызывает рекурсию.
Если вам делать необходимо изменить NSUserDefaults внутри вашего defaultsChanged, обходным решением будет добавление логического флага, который говорит, что вы вносите изменения, чтобы вы знали, что ничего не делать, когда вас вызывают ответ на ваши собственные изменения.
Возможно, вам нужен другой метод хранения, чем NSUserDefaults для вашего состояния, например, plist. Я знаю, что NSUserDefaults действительно удобно использовать, и это главная причина, по которой люди используют (и иногда неправильно) его для всех видов состояний, которые на самом деле не являются пользовательскими настройками, но это может вызвать проблемы из-за всех наворотов поставляется, например, поддержка NSUserDefaultsDidChangeNotification
наблюдателей.