Как использовать CFMutableDictionary с массивом символов в качестве ключа и целое число в качестве значения? - PullRequest
0 голосов
/ 03 ноября 2010

Я работаю в существующем приложении для iPhone, хотя мне нужно изменить код на C.

Я хочу использовать словарь в стандартном файле C, просто я не могу использовать NSDictionary, компилятор сказал, что он недействителенв c99 (поскольку заголовки Foundation / Foundation.h и Foundation / NSDictionary.h не могут быть найдены), но доступен CFDictionaryRef (заголовок coz CoreFoundation / CoreFoundation.h можно найти и импортировать).Затем я пытаюсь работать с CFDictionary, я не могу вставить пары ключ-значение в словарь, может ли кто-нибудь занять некоторое время и взглянуть на следующий код?Спасибо заранее !!

ps, вывод следующего кода:

Размер Dict: 0 Key: text.html, значение: 111

, что означаетпара значений не вставлена ​​...


CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

printf("Dict size: %d\n", (int)((CFIndex)CFDictionaryGetCount(dict)));

int i = 111;
char c[] = "text.html";

const void *key = &c;
const void *value = &i;

printf("Key: %s, value: %d\n", key, *(int *)value);

CFDictionarySetValue(dict, key, value); 

printf("Added\n");

printf("Dict size: %d\n", (int)((CFIndex)CFDictionaryGetCount(dict)));

value = (int *)CFDictionaryGetValue(dict, key);

printf("Value:  %d\n", *(int *)value);

Спасибо за ваш ввод, следующий рабочий код.


// init dict CFMutableDictionaryRef dict =CFDictionaryCreateMutable (NULL, 0, & kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);

    //insert key-value
int i = 111;
const void *value = &i;
CFDictionaryAddValue(dict, CFSTR("text.html"), CFNumberCreate(NULL, kCFNumberSInt32Type, value));
CFNumberRef valueRef = CFDictionaryGetValue(dict, CFSTR("text.html"));

    //get value based on key
int valuePtr;
CFNumberGetValue(valueRef, kCFNumberSInt32Type, (void *)&valuePtr);
    printf("value: %d\n", valuePtr);

1 Ответ

1 голос
/ 03 ноября 2010

A CFMutableDictionaryRef, созданный с &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks в качестве аргументов, ожидает базовые типы типов в качестве ключей и значений, поскольку он попытается сохранить / освободить их (используя CFRetain / CFRelease).

работать с CFStringRef и CFNumberRef вместо простых типов C (или, альтернативно, указать другие keyCallBacks и valueCallBacks, возможно NULL).

...