CFStringCreateByCombiningStrings

CFStringCreateByCombiningStrings

我遇到了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名称对象的保留计数有关,但我无法深入了解为什么它在某些情况下有效而在其他情况下不可行。

最佳答案

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说,您只能使用它来替换数组中已有的对象:


  索引…不得位于theArray的索引空间之外(0N-1包括在内,其中N是操作之前的数组计数)。


您需要CFArrayInsertValueAtIndexCFArrayAppendValue

关于cocoa - CFStringCreateByCombiningStrings中可能的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4475492/

10-09 16:32