Как правильно использовать Foundation NSString с функциями CoreFoundation? - PullRequest
3 голосов
/ 17 января 2012

Я хотел бы упростить некоторые из моих сервисных кодов цепочки для ключей и использовать CFDictionarySetValue с NSString.

для Foundation. Декларация CFDictionarySetValue выглядит так:

void CFDictionarySetValue(CFMutableDictionaryRef theDict, const void *key, const void *value)

что происходит, когда я передаю, например, @"This is a NSString" для value параметра?В моем случае компилятор не выдает предупреждение, а статический анализ ничего не ловит.Во время выполнения не происходит сбоев, поэтому это означает, что время выполнения заботится обо всем, или я должен передать [@"something" cStringUsingEncoding:NSUTF8StringEncoding] и привести его к const void*?

Мои результаты показывают, что:

NSLog(@"%s", CFDictionaryGetValue(query, kKeyForCStringInUTF8));
NSLog(@"%@", CFDictionaryGetValue(query, kKeyForNSString));

оба дают одинаковый вывод!Это сбивает с толку ...

Каково общее правило обмена объектами между CF и Foundation?Есть ли общепринятый стиль кода, хорошая практика?

Ответы [ 2 ]

3 голосов
/ 17 января 2012

NSString и другие типы являются бесплатными мостовыми соединениями со своими аналогами CoreFoundation.
См. Основные принципы проектирования базового фонда - бесплатные типы мостовых соединений :

ТамЭто ряд типов данных в платформе Core Foundation и платформе Foundation, которые можно использовать взаимозаменяемо.Это означает, что вы можете использовать ту же структуру данных, что и аргумент для вызова функции Core Foundation, или как получатель вызова сообщения Objective C.

1 голос
/ 17 января 2012

Я не уверен, что именно вы спрашиваете, поэтому я собираюсь расширить ответ Георга.Я предполагаю, что вам нужно CFMutableDictionaryRef, но вы все еще можете использовать MSMutableDictionary.Если это не ответ на ваш вопрос, пожалуйста, дайте мне знать.

На вашем месте я бы просто использовал NSMutableDictionary, поэтому вы можете просто использовать [yourDictionary setValue:yourString forKey:@"yourKey"];.Это избавляет от одного параметра, если не больше.Если вам нужен CFMutableDictionaryRef, просто используйте этот код:

CFMutableDictionaryRef cfDictionary = (CFMutableDictionaryRef) yourDictionary;

Итак, чтобы установить и получить значение, вы можете просто сделать это:

// Make the objects somewhere
NSString *yourString = @"something";
NSMutableDictionary *yourDictionary = [[NSMutableDictionary alloc] init];

// now set the value...
[dictionary setObject:yourString forKey:@"Anything at all"];

// and to get the value...
NSString *value = [yourDictionary valueForKey:@"Anything at all"];

// now you can show it
NSLog(@"%@", value);
...