NSString* to CFStringRef приводит к бесполезному массиву символов

У меня есть следующий фрагмент кода:

-(CFStringRef)setupFileName:(NSString*)_name :(NSString*)_extension
{
NSString* tmpName = [_name stringByAppendingString:_extension];
CFStringRef ref = (__bridge CFStringRef)tmpName;
return ref;
}

Когда я прерываю оператор return, ref содержит правильные данные, хорошую строку с расширением. Но когда я использую это так:

CFStringRef tickWav = [self setupFileName:_name :kTick];

Это приводит к бесполезной цепочке символов. Что-то портит мою кодировку, когда я возвращаю правильное значение из функции?? Что я могу сделать?


person bob    schedule 29.07.2016    source источник
comment
Не имеет отношения к вашей проблеме, но... Я настоятельно рекомендую назвать ваш метод со всеми параметрами: -(CFStringRef)setupFileName:(NSString*)_name withExtension:(NSString*)_extension, а также избегать _ для такого рода var. Кроме того, почему stringByAppendingString: вызывается при назначении tmpName между скобками?   -  person Larme    schedule 29.07.2016
comment
Это было в скобках, потому что приведение к CFStringRef произошло раньше ... вы знаете решение моей проблемы?   -  person bob    schedule 29.07.2016


Ответы (1)


Нет автоматического управления памятью CFTypeRef. Если бы вы вернули NSString, он был бы автоматически выпущен. Не так для CFStringRef. Таким образом, вы должны сделать работу самостоятельно.

Вам нужно сохранить CFStringRef с CFRetain и выполнить приведение __bridge_retained, а не __bridge. Вы пересекаете мост из мира объектов в мир CFTypeRef; вы должны обеспечить управление памятью для этой строки, когда она пересекает мост. Затем вам нужно будет освободить CFStringRef вручную позже в принимающем коде, иначе произойдет утечка.

person matt    schedule 29.07.2016
comment
А вообще я бы спросил, зачем вы вообще переходите мост. Не лучше ли вернуть здесь NSString? - person matt; 29.07.2016
comment
Потому что мне нужен CFStringRef... но __bridge_retained решил проблему за меня, большое спасибо. мне нужно еще кое-что изучить по этой теме - person bob; 29.07.2016
comment
Возможно, вы захотите прочитать мою книгу: apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs - person matt; 29.07.2016
comment
Используйте CFStringRef именно тогда, когда вам это нужно (и наличие примера кода, использующего CFStringRef, не является причиной, вы всегда можете изменить код). Каждый раз, когда вы используете CFStringRef, вы рискуете ошибиться. Каждый раз, когда вы используете CFStringRef нетривиальным образом, риск становится огромным. Используйте статический анализатор, который часто будет находить ошибки в вашем коде. - person gnasher729; 29.07.2016
comment
Другими словами: может быть потому, что мне нужен CFStringRef верно, но я нахожу очень сомнительным, что вам нужен CFStringRef, возвращенный вам этим методом. Если вам это нужно для какой-то другой цели, тогда это самое время пересечь мост. - person matt; 29.07.2016