0

我目前有这个功能,它是我的用户默认值:

+ (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 是否复制它获得的指针的值?

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

谢谢!

4

1 回答 1

2

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

于 2013-08-27T17:21:00.007 回答