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é?
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).
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.
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