2013-11-14 5 views
1

я столкнулся аварии SIGSEGV в моем Ios приложение сразу после вызова:NSUserDefaults синхронизации аварии

[[NSUserDefaults standardUserDefaults] synchronize]; 

Это часть трассировки стека аварии сразу после команды Синхронизировать:

CoreFoundation 0x31920232 CFCopyTypeIDDescription + 29 
CoreFoundation 0x3191cd41 <redacted> + 204 
CoreFoundation 0x31910815 <redacted> + 16 
CoreFoundation 0x3188e1ac <redacted> + 140 
CoreFoundation 0x3189d1ff CFDictionaryApplyFunction + 158 
CoreFoundation 0x3191c483 <redacted> + 282 
CoreFoundation 0x318b237f CFPropertyListWriteToStream + 138 
CoreFoundation 0x318b115d <redacted> + 296 
CoreFoundation 0x318b1031 <redacted> + 132 
CoreFoundation 0x318b03c1 <redacted> + 492 
CoreFoundation 0x318b01d1 <redacted> + 20 
CoreFoundation 0x318bb3ff <redacted> + 110 
CoreFoundation 0x318bb8fb <redacted> + 74 
CoreFoundation 0x3193cb3b <redacted> + 30 
CoreFoundation 0x3193d509 <redacted> + 32 
libdispatch.dylib 0x39bd54b7 <redacted> + 22 
libdispatch.dylib 0x39bd99f7 <redacted> + 30 
CoreFoundation 0x318c7045 CFPreferencesAppSynchronize + 312 

Это это редкий крах, поэтому я не могу воспроизвести его, и мой вопрос:

Что может вызвать такой крах?

+0

Что делать U в UserDefaults? – AntonijoDev

+0

Номера (int/float), строки и даты. Ничего особенного ... – am1987

ответ

1

Что я делаю, чтобы попытаться избежать такого рода ситуаций и лучше контролировать настройки по умолчанию, - это перебрать все через мой appDelegate (тоже работает одноэлементный класс). Идея заключается в том, что если вы хотите сохранить что-то, вы отправить его на указанный объект, в моем случае:

[appDelegate defaultsSetObject:(id)obj forKey:(NSSString *)key]; 

В этом методе я copy в OBJ и ключ (в случае, если они являются изменяемыми объектами). Если у меня возникают проблемы, как сейчас, я могу вызывать синхронизацию при каждом вызове (для принудительного немедленного сбоя) или, по крайней мере, регистрировать все.

Если ваша проблема трудно воспроизвести, потратить время на реорганизацию кода по умолчанию может стоить того. С другой стороны, вы можете создать макрос, заменить весь свой код по умолчанию макросом, а переопределив макрос, получите аналогичное поведение по отношению к тому, что я сделал. [Макрос будет выглядеть примерно так:

SAVE_OBJECT_FOR_KEY(obj, key); 

В простейшем случае просто сохраните объект. При отладке сделайте копию, как я предлагаю выше, сохраните, а затем синхронизируйте.

+0

Спасибо, это очень хороший совет. Надеюсь, это поможет в моем случае, хотя я не могу это проверить, так как сам не могу воспроизвести авария. – am1987

0

Скорее всего, какой-то объект, ранее возвращенный из пользовательских настроек по умолчанию, был слишком расширен. Когда словарь внутри NSUserDefaults, содержащий объект, сериализуется в plist, авария возникает, когда он пытается сериализовать теперь мертвый объект

Смежные вопросы