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]()
Ответы
Ответ 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