Структура, завернутая в проблемы с памятью NSValue

В настоящее время у меня есть эта функция, которая инициализирует мои пользовательские настройки по умолчанию:

+ (void)initialize
{
    // Create a dictionary to hold the default user preference values
    NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary];

    // Put defaults in the dictionary
    [defaultValues setObject:@(YES) forKey:@"pref key 1"];
    ... (further inits)

    MyCStruct struct;
    struct.width = struct.height = 0;
    struct.frameDuration = struct.frameTimeScale = 0;

    NSValue* structDefaultValue = [NSValue value:&struct 
                                    withObjCType:@encode(MyCStruct)];
    [defaultValues setObject:structDefaultValue 
                      forKey:@"myPrefKey"];

    // Register the dictionary of defaults
    [[NSUserDefaults standardUserDefaults] registerDefaults: defaultValues];
}

Я получаю точку останова исключения Obj-C в «CFRetain» при регистрации значений по умолчанию. Все было хорошо ДО того, как я использовал NSValue, поэтому я уверен, что это связано с памятью. Я знаю, что структура просто действительна в локальном стеке функций, поэтому мне интересно, в этом ли проблема? Копирует ли NSValue значение, на которое он получает указатель?

Должен ли я создавать структуру в куче?

Спасибо!


person guitarflow    schedule 27.08.2013    source источник


Ответы (1)


Вы не можете сохранить NSValue прямо в пользовательских настройках по умолчанию, потому что он поддерживается plist. Таким образом, все записи в словаре должны быть действительны для хранения в plist. Рассмотрите возможность сохранения значений в виде основных целых чисел или кодирования структуры в формате данных или строки.

person Wain    schedule 27.08.2013