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 'NSSsortingng *' to C pointer type 'CFSsortingngRef' (aka 'const struct __CFSsortingng *') requires a bridged cast "
Le code est comme suit:
- (NSSsortingng *)_encodeSsortingng:(NSSsortingng *)ssortingng { NSSsortingng *result = (NSSsortingng *)CFURLCreateSsortingngByAddingPercentEscapes(NULL, (CFSsortingngRef)ssortingng, // this is line in error NULL, (CFSsortingngRef)@";/?:@&=$+{},", 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 objects Core Foundation (références CF *) ne sont pas contrôlés par ARC, seuls les objects Obj-C le sont. Donc, lorsque vous effectuez une conversion entre eux, vous devez indiquer à ARC la propriété de l’object afin de pouvoir les nettoyer correctement. Le cas le plus simple est un cast __bridge
, pour lequel ARC ne fera aucun travail supplémentaire (il suppose que vous manipulez vous-même la mémoire de l’object).
Voici un bon tutoriel ARC que j’ai trouvé plus facile à comprendre que la documentation d’Apple sur laquelle @jtbandes fait référence.
Jetez un coup d’œil à la section intitulée «Passerelle sans frais» en particulier.
Je sais que c’est un vieux sujet, je suis tombé sur ce problème alors que je dois utiliser
- (NSSsortingng *)URLEncodedSsortingng { NSSsortingng *result = (NSSsortingng *)CFURLCreateSsortingngByAddingPercentEscapes(kCFAllocatorDefault, (CFSsortingngRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFSsortingngEncodingUTF8); [result autorelease]; return result; }
Donc ce que j’ai fait est d’aller à la cible> phase de construction> comstackr des sources . Votre fichier est répertorié, double-cliquez dessus et ajoutez les lignes suivantes à côté de votre fichier.
-fno-objc-arc