包含在NSValue内存问题中的Struct

时间:2013-08-27 16:38:08

标签: objective-c struct nsuserdefaults nsvalue

我目前有这个函数,init是我的用户默认值:

+ (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];
}

我在注册默认值时在“CFRetain”中获得了一个Obj-C异常断点。 在使用NSValue之前,一切都很好,所以我确信这与记忆有关。我知道结构只在本地函数堆栈上有效,所以我想知道这是不是问题? NSValue是否复制了它获取指针的值?

我应该在堆上创建结构吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您无法将NSValue直接存储到用户默认值中,因为它由plist支持。因此,字典中的所有条目都需要对plist中的存储有效。考虑将值存储为基本整数或将结构编码为数据或字符串格式。