165 votes

Comment convertir CFStringRef NSString ?

<pre><code></code><p><code></code><code></code>?</p></pre>

346voto

NilObject Points 7874

NSString et CFStringRef sont "sans frais ponté", ce qui signifie que vous pouvez simplement transtypage entre eux.

Par exemple:

CFStringRef aCFString = (CFStringRef)aNSString;

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

NSString *aNSString = (NSString *)aCFString;

La syntaxe précédente a été pour la MRC. Si vous utilisez un ARC, le nouveau casting de la syntaxe est comme suit:

NSString *aNSString = (__bridge NSString *)aCFString;

fonctionne aussi bien. La chose à noter est que CoreFoundation souvent le retour des objets avec +1 le nombre de références, ce qui signifie qu'ils ont besoin d'être libéré (tous les CF[Type]Créer des fonctions de formatage de le faire).

La bonne chose est que dans le Cacao, vous pouvez utiliser en toute sécurité autorelease ou version gratuit.

16voto

binary star Points 81

Si vous utilisez un ARC dans les dernières versions de Mac OS X / Objective C, c’est vrai facile :

Cependant, Xcode heureusement vous avertira lorsque vous essayez d’interurbain gratuit pont CFString à NSString et offrir à envelopper automatiquement dans CFBridgingRelease(), que vous pouvez accepter et laissez-le insérer automatiquement le wrapper pour vous si vous cliquez sur l’option.

12voto

Martin Cote Points 12762

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

Pour plus d’informations, consultez Types de pont sans frais.

4voto

gavinbeatty Points 139

En fait, vous ne devriez pas utiliser de Cacao conserver, libération, autorelease sur les principaux objets de la Fondation en généralité. Si vous êtes à l'aide de la Collecte des Ordures (uniquement sur Mac OS X pour le moment), ceux de conserver, de libération, autorelease les appels sont tous des no-ops. D'où des fuites de mémoire.

D'Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html:

Il est important d'apprécier l'asymétrie entre le Fondement et le Cacao-où conserver, la libération et l'autorelease sont no-ops. Si, par exemple, vous avez équilibré un CFCreate... avec la libération ou de la autorelease, vous permettra de fuite de l'objet dans une de ces ordures de l'environnement:

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

À l'inverse, à l'aide de CFRelease pour libérer un objet que vous avez précédemment conservées à l'aide de conserver entraînera dans un compte de référence erreur de dépassement de capacité.


PS: ne peuvent pas sembler commentaire sur Peter Hosey réponse - désolé pour l'ajout de mon propre inutilement.

3voto

Peter Hosey Points 66275

Je vais ajouter que non seulement vous pouvez aller de CFString à NSString avec seulement un type-casting, mais il fonctionne de la manière d’autre établissements. Vous pouvez laisser tomber la message, qui est une chose de moins vous devez libérer plus tard. (CF utilisations où Cocoa utilise `` , donc quoi qu’il en soit, vous aurait eu besoin de le libérer.)

Le code résultant :

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