CFStringCreateByCombiningStrings中可能存在的错误

时间:2010-12-17 22:58:51

标签: cocoa macos

我遇到了无法解决的CFStringCreateByCombiningString问题。似乎逃避解释:

CFMutableArrayRef filename_arr = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

// insert prefix
int part_prefix = part + 1;
CFStringRef part_str = CFNumberFormatterCreateStringWithValue(kCFAllocatorDefault, format_ref, kCFNumberIntType, &part_prefix);
CFArraySetValueAtIndex(filename_arr, 0, part_str);

// insert prefix separator
CFArraySetValueAtIndex(filename_arr, 1, CFSTR("_"));

// insert name
CFStringRef file_name = mKitManager.CreatePartName(part); // creates and returns a new CFStringRef
CFArraySetValueAtIndex(filename_arr, 2, file_name);
printf("file_name string length: %d\n", CFStringGetLength(file_name));

// add file type extension
CFStringRef file_ext = CFSTR(".aif");
CFArraySetValueAtIndex(filename_arr, 3, file_ext);

// create full file name
CFStringRef full_file_name = CFStringCreateByCombiningStrings(kCFAllocatorDefault, filename_arr, CFSTR(""));
printf("full_file_name string length: %d\n", CFStringGetLength(full_file_name));

在某些情况下,产生的组合字符串比应该的短。例如,当我在索引2处插入名称字符串时,我还检查字符串长度,例如长度为10个字符。

调用CFStringCreateByCombiningStrings后,生成的字符串有时只有3个字符。前两个元素已正确组合,但只添加了名称字符串的第一个字符,文件扩展名完全被忽略。

我可以重现这一点,但不知道为什么会这样。可能的错误?

*编辑:找到问题的解决方法。我认为这个问题与CFStringRef名称对象上的保留计数有关,但我无法理解为什么它在某些情况下有效而在其他情况下无效。

2 个答案:

答案 0 :(得分:2)

CFMutableArrayRef filename_arr = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

您已创建一个空数组。

CFArraySetValueAtIndex(filename_arr, 0, part_str);
CFArraySetValueAtIndex(filename_arr, 1, CFSTR("_"));
CFArraySetValueAtIndex(filename_arr, 2, file_name);
CFArraySetValueAtIndex(filename_arr, 3, file_ext);

然后尝试替换空数组的第一到第四个元素。

我很惊讶你有CFStringCreateByCombiningStrings电话。 NSMutableArray会引发异常。

The documentation for the CFArraySetValueAtIndex function表示您只能用它来替换数组中已有的对象:

  

索引...不得位于theArray0N-1之间的索引空间之外,其中N是操作之前的数组计数。

您需要CFArrayInsertValueAtIndexCFArrayAppendValue

答案 1 :(得分:0)

你完全没有CFRelease()电话让我相信这是一个内存管理问题。您是否知道由其中包含“Create”的函数返回的每个Core Foundation对象都会返回一个拥有的对象? (见:"The Create Rule"