2016-07-29 10 views
0

У меня есть следующий фрагмент кода:NSString * к CFStringRef приводит бесполезный массив символов

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

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

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

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

+0

Не связано с вами вопрос, но ... Я настоятельно рекомендую назвать ваш метод со всеми параметрами: '- (CFStringRef) setupFileName: (NSString *) _ name withExtension: (NSString *) _ extension', а также избегать '_' для такого рода var. Кроме того, почему 'stringByAppendingString:' вызов при назначении 'tmpName' между скобками? – Larme

+0

Это было в скобках, потому что приведение в CFStringRef произошло раньше. Вы знаете решение моей проблемы? – bob

ответ

1

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

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

+0

Но в целом я бы спросил, почему вы пересекаете мост вообще. Разве вы не вернете здесь NSString? – matt

+0

Потому что мне нужен CFStringRef ... но эй, __bridge_retained решил проблему для меня, большое спасибо. Мне нужно изучить еще несколько вопросов по этой теме. – bob

+0

Можете прочитать мою книгу: http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs – matt