Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa cfStringCreateByCombiningString中可能存在的错误_Cocoa_Macos - Fatal编程技术网

Cocoa cfStringCreateByCombiningString中可能存在的错误

Cocoa cfStringCreateByCombiningString中可能存在的错误,cocoa,macos,Cocoa,Macos,我无法解决CFStringCreateByCombiningString的问题。似乎在逃避解释: CFMutableArrayRef filename_arr = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); // insert prefix int part_prefix = part + 1; CFStringRef part_str = CFNumberFormatterCreateSt

我无法解决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个字符

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

我可以复制这个,但不知道为什么会发生。一个可能的错误


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

您完全没有调用
CFRelease()
使我相信这是内存管理问题。您是否意识到,由“CREATE”函数返回的每个核心基础对象都返回一个已拥有的对象?(见:)

您已经创建了一个空数组

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

我很惊讶您通过组合字符串来调用
cfstringcreatebycombingstrings
。NSMutableArray将引发异常

表示只能使用它替换阵列中已有的对象:

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


您需要
CFArrayInsertValueAtIndex
CFArrayAppendValue

即使他泄漏了所有对象,而不仅仅是删除了内存管理,也不会导致对象出现故障。只有当他释放它们并在之后尝试使用它们时,这才有可能。是的,我知道创建规则,并选择不显示我的CFRelease()调用,因为正如上面的评论员所指出的,这实际上与我正在经历和询问的问题没有任何关系。啊哈,好主意。我假设数组会自动增长。@Dave DeLong:我想提问者也是。☺我正在创建一个容量无限的空阵列。CFArrayInsertValueAtIndex和CFArrayAppendValue都没有表现得更好,事实上导致了崩溃。我无法验证这是否是由于潜在的内存管理问题造成的。在将对象添加到数组之前,我对对象的使用相当复杂。我在文档中找不到任何说明CFArraySetValueAtIndex应仅用于替换对象的引用。几个月来,我一直在使用完全相同的技术创建一个空数组,并毫无问题地设置值。斯蒂芬·布林克霍恩:容量不重要,它不是一个应该考虑的问题,它是一个可以考虑的问题CFArraySetValueAtIndex不追加,只替换,并且不能替换空数组中的任何内容。我在答复中引用了文件的相关部分。如果正确的函数导致崩溃,那么这肯定表明内存管理有问题;在僵尸工具下运行你的应用程序以找到它。
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);