非常肯定这个问题的答案是否定的,但是我不得不问:有没有CFNumber等同于CFString的CFSTR宏?为了避免这种事情:
char one = 1;
CFNumberRef cfONE = CFNumberCreate(kCFAllocatorDefault, kCFNumberCharType, &one);
if (cfONE != NULL) {
... finally I can compare something to the number 1! ...
CFRelease(cfONE);
} else {
// not likely, but possible, if you really want to be conservative
}
请注意,我在此特定代码中使用Objective-C 。
埃里克
答案 0 :(得分:1)
CFSTR
与您的案例略有不同
CFSTR()允许创建编译时常量CFStringRefs;争论 应该是一个恒定的C字符串。
CFSTR(),不是“复制”或“创建”功能,不会返回新的 给你参考。因此,您不应该释放返回值。这是 很像常量C或Pascal字符串---当你使用“hello world”时 在一个程序中,你不要释放它。
您使用CFNumberCreate
创建的对象将由调用者拥有,因此您可能仍希望在名称中保留单词create
以使其清晰。
你总是可以创建一个辅助函数,以避免反复传递相同的参数
CFNumberRef PSNumberCreateWithChar(x)
{
return CFNumberCreate(kCFAllocatorDefault, kCFNumberCharType, &x);
}
答案 1 :(得分:1)
如果您打算多次使用此功能,可以使用static
修饰符并停止担心释放:
static CFNumberRef cfONE = NULL;
if (cfONE == NULL) {
static char one = 1;
cfONE = CFNumberCreate(kCFAllocatorDefault, kCFNumberCharType, &one);
assert (cfONE != NULL); // Oh no, destroy the world!
}
// ... finally I can compare something to the number 1! ...
只要你有静态,静态分析器就会让你自己解决泄漏问题,因为它是一个预期的常量内存分配,O(1)
而不是O(n)
n
执行次数。
有几种方法可以将其作为宏。我想出了这个懒惰的人:
#define CFNUMDEF(name, type, numberType, value) \
static CFNumberRef name = NULL; \
if ( name == NULL) { \
static type val = value ;\
name = CFNumberCreate(kCFAllocatorDefault, numberType , &val);\
assert ( name != NULL); \
}
CFNUMDEF(cfONE, char, kCFNumberCharType, 1);
// ... finally I can compare something to the number 1! ...
答案 2 :(得分:0)
CFNumberRef
和NSNumber
是免费桥接的,因此您可以使用NSNumber
文字语法并投射结果。