Возможная ошибка в CFStringCreateByCombiningStrings - PullRequest
0 голосов
/ 18 декабря 2010

У меня есть проблема с 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 ]

2 голосов
/ 19 декабря 2010
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 вызвал бы исключение.

В документации для функции CFArraySetValueAtIndex говорится, что вы можете использовать ее только для замены объектов, уже находящихся в массиве:

Индекс… не должен находиться за пределами индексного пространства от theArray (от 0 до N-1 включительно, где N - это количество массива до операции).

Вы хотите CFArrayInsertValueAtIndex или CFArrayAppendValue.

0 голосов
/ 19 декабря 2010

Ваше полное отсутствие CFRelease() вызовов заставляет меня поверить, что это проблема управления памятью. Знаете ли вы, что каждый объект Core Foundation, возвращаемый функцией с «Create», возвращает принадлежащий объект? (См .: «Правило создания» )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...