如何正确使用Foundation的NSString和CoreFoundation函数?

时间:2012-01-16 22:35:25

标签: objective-c ios core-foundation

我想简化部分钥匙串服务代码,并将CFDictionarySetValue与Foundation NSString一起使用。

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 个答案:

答案 0 :(得分:3)

NSString和其他类型的免费桥接到他们的CoreFoundation对应物 见Core Foundation Design Concepts - Toll-Free Bridged Types

  

Core Foundation框架和Foundation框架中有许多数据类型可以互换使用。这意味着您可以使用与Core Foundation函数调用的参数相同的数据结构,也可以使用Objective-C消息调用的接收者。

答案 1 :(得分:1)

我不确定你到底在问什么,所以我要扩大Georg的答案。我假设您需要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);