приведение типа указателя Objective-C 'NSString *' к указателю типа C 'CFStringRef' (он же const struct __CFString * ') требует мостового преобразования - PullRequest
40 голосов
/ 17 июля 2011

При преобразовании программы Objective C в ARC Objective C я получаю ошибку:

"cast of Objective-C pointer type 'NSString *' to C pointer type 'CFStringRef' (aka 'const struct __CFString *') requires a bridged cast "

Код выглядит следующим образом:

- (NSString *)_encodeString:(NSString *)string
{
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, 
                                   (CFStringRef)string, // this is line in error
                                   NULL, 
                                   (CFStringRef)@";/?:@&=$+{}<>,",
                                   kCFStringEncodingUTF8);
    return [result autorelease];
}

Что такое актерский состав?

Screenshot for error

Ответы [ 3 ]

56 голосов
/ 17 июля 2011

Ознакомьтесь с документацией ARC на веб-сайте LLVM. Вам придется использовать __bridge или одно из других ключевых слов.

Это потому, что объекты Core Foundation (CF * Refs) не контролируются ARC, только объекты Obj-C. Поэтому, когда вы переходите между ними, вы должны сообщить ARC о праве собственности на объект, чтобы он мог правильно их очистить. Простейший случай - приведение __bridge, для которого ARC не будет выполнять никакой дополнительной работы (предполагается, что вы сами обрабатываете память объекта).

19 голосов
/ 02 октября 2011

Вот хороший учебник по ARC , который, как мне показалось, легче понять, чем документация Apple, на которую ссылается @jtbandes.

Взгляните, в частности, на раздел, озаглавленный "Мосты без звонков".

0 голосов
/ 06 сентября 2016

Я знаю, что это старый поток, я сталкивался с этой проблемой, когда мне нужно использовать

- (NSString *)URLEncodedString 
{
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                       (CFStringRef)self,
                                                                       NULL, CFSTR("!*'();:@&=+$,/?%#[]"),
                                                                       kCFStringEncodingUTF8);
[result autorelease];
return result;
}

Итак, я перешел к Цель> Фаза сборки> Компиляция исходников ,В списке есть ваш файл, дважды щелкните по нему и добавьте следующие строки рядом с вашим файлом.

-fno-objc-arc
...