web-dev-qa-db-fra.com

la conversion du type de pointeur Objective-C 'NSString *' vers le type de pointeur C 'CFStringRef' (ou 'const struct __CFString *') Acheter une conversion pontée

Lors de la conversion d'un programme Objective-C en ARC Objective-C, le message d'erreur suivant s'affiche:

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

Le code est comme suit:

- (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 casting ponté?

Screenshot for error

40
Michael Rowe

Consultez la documentation ARC sur le site Web de LLVM. Vous devrez utiliser __bridge ou l'un des autres mots clés.

En effet, les objets Core Foundation (CF * Refs) ne sont pas contrôlés par ARC, mais uniquement les objets Obj-C. Ainsi, lorsque vous convertissez entre eux, vous devez informer ARC de la propriété de l'objet afin qu'il puisse le nettoyer correctement. Le cas le plus simple est une conversion __bridge pour laquelle ARC ne fera aucun travail supplémentaire (il suppose que vous gérez vous-même la mémoire de l'objet).

56
jtbandes

Voici un tutoriel Nice ARC que j’ai trouvé plus facile à comprendre que la documentation d’Apple que @jtbandes référence. 

Jetez un coup d'œil à la section intitulée "Pontage sans frais" en particulier.

19
benvolioT

Je sais que c'est un vieux fil, 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 est d’aller dans Cible> Phase de compilation> Compiler les sources . Votre fichier est répertorié, double-cliquez dessus et ajoutez les lignes suivantes à côté de votre fichier.

-fno-objc-arc
0
Nij