我想简化部分钥匙串服务代码,并将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之间交换对象的一般规则是什么?有一种普遍接受的代码风格,一种好的做法吗?
答案 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);