如何在NSMutableDictionary中存储CoreFoundation类型引用?我怎么知道特定类型是否是CFType? (比如CFString)
答案 0 :(得分:2)
通常,您必须将任何原始数据类型或Core Foundation对象转换为基础对象,以便将其插入到NSDictionary中,因此在从字典中获取值后,您可以确信它将是Cocoa对象。 / p>
许多Core Foundation对象都是"免费桥接"与他们的基础对应物,以便于来回转换。例如,CFStringRef和NSString,CFArrayRef和NSArray,CFDictionaryRef和NSDictionary等。因此,您可以简单地转换Core Foundation类型以将其存储到NSMutableDictionary中。例如,
CFStringRef myString = CFSTR("some string");
NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:(__bridge id)(myString), @"myKey", nil];
NSLog(@"Dictionary contains %@", mutableDictionary);
//release dictionary here if not using ARC...
对于Core Foundation,所有Core Foundation对象都是从CFType派生的。所以关于CFStringRef是否是CFTypeRef的问题,是的。此外,只有Core Foundation,CFTypes可以插入到CFDictionaryRef容器中。如果您想从基本CFTypeRef中找出Core Foundation对象的类型,可以在其上调用CFTypeGetID()。然后,你需要比较类型,例如,检查它是否是一个字符串对象,你会做什么
CFStringRef myString = CFSTR("some string"); //say this is returned from CFDictionaryGetValue()
if (CFGetTypeID(myString) == CFStringGetTypeID())
{
NSLog(@"CFType is a string");
}
每个Core Foundation对象都有自己的get type id函数,具有一致的命名约定。因此CFDataRef将具有CFDataGetTypeID(),CFDateRef将具有CFDateGetTypeID()。