Réponses
Trop de publicités?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.
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.
Ils sont équivalents, donc vous pouvez juste lancer le CFStringRef :
Pour plus d’informations, consultez Types de pont sans frais.
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.
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.
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 :