Question

NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);

Comment puis-je obtenir un nouveau NSString à partir de aCFString ?

Était-ce utile?

La solution

NSString et CFStringRef sont des "ponts sans ponts", ce qui signifie que vous pouvez simplement les transtyper entre eux.

Par exemple:

CFStringRef aCFString = (CFStringRef)aNSString;

fonctionne parfaitement et de manière transparente. De même:

NSString *aNSString = (NSString *)aCFString;

La syntaxe précédente était pour MRC. Si vous utilisez ARC, la nouvelle syntaxe de conversion est la suivante:

NSString *aNSString = (__bridge NSString *)aCFString;

fonctionne aussi bien. Il est important de noter que CoreFoundation renvoie souvent les objets avec un nombre de références égal à +1, ce qui signifie qu'ils doivent être libérés (toutes les fonctions de type CF [Type] Create le font).

La bonne chose est que dans Cocoa, vous pouvez utiliser en toute sécurité autorelease ou release pour les libérer.

Autres conseils

Si vous utilisez ARC dans les versions récentes de Mac OS X / Objective C, c'est réel facile:

NSString *happyString = (NSString *)CFBridgingRelease(sadString);

Cependant, Xcode vous avertira volontiers lorsque vous essayez de passer un pont sans frais. CFString to NSString et offre de l’envelopper automatiquement dans CFBridgingRelease (), que vous pouvez accepter et laissez-le insérer automatiquement le wrapper pour vous si vous cliquez sur l'option.

Ils sont équivalents, vous pouvez donc lancer le CFStringRef:

NSString *aNSString = (NSString*)aCFString;

Pour plus d'informations, voir Toll- Types pontés gratuits .

En fait, vous ne devriez pas utiliser Cocoa Retenir, Libérer, Autorelease sur les objets Core Foundation en général. Si vous utilisez Garbage Collection (uniquement sous Mac OS X pour le moment), les appels conservés, validés, à libération automatique ne sont pas autorisés. D'où des fuites de mémoire.

De Apple http: // développeur .apple.com / mac / bibliothèque / documentation / Cocoa / Conceptual / GarbageCollection / Articles / gcCoreFoundation.html :

Il est important d’apprécier l’asymétrie entre Core Foundation et Cocoa, où la rétention, la libération et la libération automatique sont des options simples. Si, par exemple, vous avez équilibré un CFCreate… avec release ou autorelease, vous ferez fuir l'objet dans un environnement ramassé de déchets:

NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment

Inversement, l'utilisation de CFRelease pour libérer un objet que vous avez précédemment retenu à l'aide de retenue entraînera une erreur de dépassement du compte de références.

PS: n'arrive pas à commenter la réponse de Peter Hosey - désolé d'avoir ajouté la mienne inutilement.

J'ajouterai que non seulement vous pouvez passer de CFString à NSString avec uniquement une transtypage, mais que cela fonctionne également dans l'autre sens. Vous pouvez supprimer le message CFStringCreateWithCString , ce qui est une chose de moins à libérer ultérieurement. (CF utilise Create , où Cocoa utilise alloc , de toute façon, vous auriez eu besoin de le libérer.)

Le code résultant:

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];

J'avais un problème avec ARC et le nombre de retenues de CFStrings. Utilisation de NilObjects répondre avec une légère modification a fonctionné parfaitement pour moi. Je viens d'ajouter retenu par exemple.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

Vous devez le lancer:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

Vous pouvez utiliser: avec CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top