3

很确定这个答案是否定的,但我不得不问这已经够痛苦了:是否有一个 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。

埃里克

4

3 回答 3

1

CFSTR和你的情况有点不同

CFSTR() 允许创建编译时常量 CFStringRefs;参数应该是一个常量 C 字符串。

CFSTR() 不是“复制”或“创建”函数,不会为您返回新的引用。所以,你不应该释放返回值。这很像常量 C 或 Pascal 字符串 --- 当您在程序中使用“hello world”时,您不会释放它。

由于您创建的对象CFNumberCreate将归调用者所有,因此您可能仍希望保留create名称中的单词以明确这一点。

您总是可以创建一个辅助函数,以避免一遍又一遍地传递相同的参数

CFNumberRef PSNumberCreateWithChar(x)
{
  return CFNumberCreate(kCFAllocatorDefault, kCFNumberCharType, &x);
}
于 2013-09-11T22:06:14.560 回答
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! ...
于 2013-09-11T22:39:09.857 回答
0

CFNumberRef并且NSNumber是免费桥接的,因此您可以使用NSNumber文字语法并转换结果。

于 2013-09-11T21:56:53.173 回答