Подтвердить что ты не робот

Cast of Objective-C тип указателя 'NSString *' к типу C-типа 'CFStringRef' (aka 'const struct __CFString *') требует мостового перехода

При преобразовании программы 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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Взгляните на раздел под названием "Бесплатный мостовой переход".

Ответ 3

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

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

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

-fno-objc-arc