常量的CFNumber宏

时间:2013-09-11 21:45:56

标签: ios

非常肯定这个问题的答案是否定的,但是我不得不问:有没有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

埃里克

3 个答案:

答案 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)

CFNumberRefNSNumber是免费桥接的,因此您可以使用NSNumber文字语法并投射结果。