Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implicit conversion of Objective-C pointer type. Bridged cast issue [duplicate]

When converting an Objective-C program to a Objective-C ARC, I get the error:

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

The code is as follows:

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

What is a bridged cast?

Screenshot for error

like image 236
Michael Rowe Avatar asked Jul 17 '11 17:07

Michael Rowe


People also ask

What is an implicit conversion in C++?

(C++11) Implicit conversions are performed whenever an expression of some type T1 is used in context that does not accept that type, but accepts some other type T2; in particular: when the expression is used as the argument when calling a function that is declared with T2 as parameter;

Can you convert a pointer to a void?

Such conversion (known as null pointer conversion) is allowed to convert to a cv-qualified type as a single conversion, that is, it's not considered a combination of numeric and qualifying conversions. A prvalue pointer to any (optionally cv-qualified) object type T can be converted to a prvalue pointer to (identically cv-qualified) void.

What is a null pointer conversion in C++?

A null pointer constant (see NULL ), can be converted to any pointer type, and the result is the null pointer value of that type. Such conversion (known as null pointer conversion) is allowed to convert to a cv-qualified type as a single conversion, that is, it's not considered a combination of numeric and qualifying conversions.

Can a null pointer be converted to a prvalue?

If the original pointer is a null pointer value, the result is a null pointer value of the destination type. A prvalue pointer to a (optionally cv-qualified) derived class type can be converted to a prvalue pointer to its (identically cv-qualified) base class.


2 Answers

Have a look at the ARC documentation on the LLVM website. You'll have to use __bridge or one of the other keywords.

This is because Core Foundation objects (CF*Refs) are not controlled by ARC, only Obj-C objects are. So when you convert between them, you have to tell ARC about the object's ownership so it can properly clean them up. The simplest case is a __bridge cast, for which ARC will not do any extra work (it assumes you handle the object's memory yourself).

like image 195
jtbandes Avatar answered Sep 18 '22 13:09

jtbandes


I know this is an old thread, I came across this issue while I need to use

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

So what I did is go to Target > Build phase > Compile sources. There is your file listed, double click on that and add following lines next to your file.

-fno-objc-arc
like image 23
Nij Avatar answered Sep 16 '22 13:09

Nij