fonctionne aussi bien. La chose clé à noter est que CoreFoundation retournera souvent des objets avec un nombre de références +1, ce qui signifie qu'ils doivent être libérés (toutes les fonctions de format 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.
Cependant, Xcode vous avertira volontiers lorsque vous essayez de relier sans frais CFString à NSString et vous proposera de l'envelopper automatiquement dans CFBridgingRelease (), ce que vous pouvez accepter et laisser insérer automatiquement le wrapper pour vous si vous cliquez sur l'option.
Je ne suis pas sûr, mais je pense que (__bridge NSString *)c'est suffisant: il ne sert à rien d'incrémenter le compte de conservation avec CFBridgingRelease().
Cœur
12
Ils sont équivalents, vous pouvez donc simplement convertir CFStringRef:
En fait, vous ne devriez pas utiliser Cocoa conserver, libérer, autorelease sur les objets Core Foundation en général. Si vous utilisez Garbage Collection (uniquement sur Mac OS X pour le moment), ceux-ci retiennent, libèrent, autorelease les appels sont tous sans opération. D'où des fuites de mémoire.
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 interdites. Si, par exemple, vous avez équilibré un CFCreate… avec release ou autorelease, vous fuirez l'objet dans un environnement garbage collection:
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 conservé à l'aide de conserver entraînera une erreur de dépassement du nombre de références.
PS: je 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 conversion de type, mais cela fonctionne également dans l'autre sens. Vous pouvez supprimer le CFStringCreateWithCStringmessage, ce qui est une chose de moins que vous devez publier plus tard. (CF utilise Createlà où Cocoa utilise alloc, donc de toute façon, vous auriez dû le publier.)
J'avais un problème avec l'ARC et le nombre de retenues de CFStrings. L'utilisation de la réponse NilObjects avec une légère modification a parfaitement fonctionné pour moi. Je viens d'ajouter conservé par exemple.
Si vous utilisez ARC dans les versions récentes de Mac OS X / Objective C, c'est très simple:
Cependant, Xcode vous avertira volontiers lorsque vous essayez de relier sans frais CFString à NSString et vous proposera de l'envelopper automatiquement dans CFBridgingRelease (), ce que vous pouvez accepter et laisser insérer automatiquement le wrapper pour vous si vous cliquez sur l'option.
la source
(__bridge NSString *)
c'est suffisant: il ne sert à rien d'incrémenter le compte de conservation avecCFBridgingRelease()
.Ils sont équivalents, vous pouvez donc simplement convertir CFStringRef:
Pour plus d'informations, voir Types pontés sans frais .
la source
En fait, vous ne devriez pas utiliser Cocoa conserver, libérer, autorelease sur les objets Core Foundation en général. Si vous utilisez Garbage Collection (uniquement sur Mac OS X pour le moment), ceux-ci retiennent, libèrent, autorelease les appels sont tous sans opération. D'où des fuites de mémoire.
Depuis Apple http://developer.apple.com/mac/library/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 interdites. Si, par exemple, vous avez équilibré un CFCreate… avec release ou autorelease, vous fuirez l'objet dans un environnement garbage collection:
Inversement, l'utilisation de CFRelease pour libérer un objet que vous avez précédemment conservé à l'aide de conserver entraînera une erreur de dépassement du nombre de références.
PS: je n'arrive pas à commenter la réponse de Peter Hosey - désolé d'avoir ajouté la mienne inutilement.
la source
J'ajouterai que non seulement vous pouvez passer de CFString à NSString avec uniquement une conversion de type, mais cela fonctionne également dans l'autre sens. Vous pouvez supprimer le
CFStringCreateWithCString
message, ce qui est une chose de moins que vous devez publier plus tard. (CF utiliseCreate
là où Cocoa utilisealloc
, donc de toute façon, vous auriez dû le publier.)Le code résultant:
la source
J'avais un problème avec l'ARC et le nombre de retenues de CFStrings. L'utilisation de la réponse NilObjects avec une légère modification a parfaitement fonctionné pour moi. Je viens d'ajouter conservé par exemple.
la source
Vous devez le lancer:
la source
Vous pouvez utiliser: Avec CFStringRef idc;
la source