40 votes

Le cast d'un pointeur Objective-C de type 'NSString *' vers un pointeur C de type 'CFStringRef' (alias 'const struct __CFString *') nécessite un bridged cast.

Lors de la conversion d'un programme Objective-C en un Objective-C ARC, j'obtiens l'erreur suivante :

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

Le code est le suivant :

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

Qu'est-ce qu'un moulage ponté ?

Screenshot for error

56voto

jtbandes Points 39804

Jetez un coup d'œil à la Documentation de l'ARC sur le site web de LLVM. Vous devrez utiliser __bridge ou l'un des autres mots-clés.

Cela est dû au fait que les objets de la Fondation Core (CF*Refs) ne sont pas contrôlés par ARC, seuls les objets Obj-C le sont. Ainsi, lorsque vous effectuez une conversion entre les deux, vous devez indiquer à l'ARC la propriété de l'objet afin qu'il puisse les nettoyer correctement. Le cas le plus simple est un __bridge pour lesquels ARC n'effectuera aucun travail supplémentaire (il suppose que vous gérez vous-même la mémoire de l'objet).

19voto

benvolioT Points 3003

Voici un beau tutoriel ARC que j'ai trouvé plus facile à comprendre que la documentation d'Apple à laquelle @jtbandes fait référence.

Jetez notamment un coup d'œil à la section intitulée "Toll free bridging".

3voto

Nij Points 358

Je sais que c'est un vieux fil de discussion, mais je suis tombé sur ce problème alors que je devais utiliser

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

Donc ce que j'ai fait, c'est aller sur Target > Build phase > Compile sources . Il y a votre fichier listé, double-cliquez dessus et ajoutez les lignes suivantes à côté de votre fichier.

-fno-objc-arc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X