ARC et CFRelease?
Je suis un peu confus. Partout où je l'ai lu, suggèrent que lors de l'utilisation de l'ARC, vous avez encore besoin de libérer de base objets de la fondation qui fait sens, l'ARC n'a pas les gérer. Cependant, j'ai une méthode qui utilise des FC, les méthodes des objets que j'ai utilisé CFRelease
, mais qui ensuite entraîné l'application crash. Décommentant mon CFRelease
s résout le problème, mais alors je suis en supposant que j'ai une fuite de mémoire?
Quelqu'un pourrait-il expliquer de quelles choses doivent libérer et qui ne le sont pas, ou tout autre chose qui ne va pas dans ce code?
+ (NSString *) fileExtensionForMimeType:(NSString *)type
{
CFStringRef mimeType = (__bridge CFStringRef)type;
CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL);
CFStringRef extension = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension);
NSString *ext = (__bridge NSString *)extension;
//CFRelease(mimeType);
//CFRelease(uti);
//CFRelease(extension);
return ext;
}
Les trois commenté CFRelease
appels de résoudre le problème comme mentionné, mais je sais que c'est faux. Que dois-je faire?
- quel est le problème avec les 3 a commenté commandes. Supprimer simplement les commentaires c'est bien
- Quand je décommenter, mon application se bloque avec un EXC_BAD_ACCESS exception. Faire une trace dans les instruments de cette méthode et de commenter ces lignes fixe
- Vous ne devez libérer uti & extension, mais pas de type mime parce que vous n'êtes pas augmenter le nombre de références de type mime. vous êtes tout simplement le type de moulage. Supprimez le commentaire de la dernière à la CFRelease et puis laissez-moi savoir ce qui se passe
- Spot sur Evol, merci!
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas publier
mimeType
parce que vous ne le possèdent pas. Vous n'avez pas de transfert de propriété avec le__bridge
exprimés.Vous devriez être en libérant
uti
puisque vous l'avez créée.Vous devez également la libération
extension
depuis la création de bien, mais susceptibles de provoquer des problèmes avecext
. Au lieu de cela, le transfert de propriété àext
.Je vous suggère le texte suivant:
CFBridgingRelease
plutôt que__bridge_transfer
. Aussi, êtes-vous tout à fait sûr que vous avez besoinCFRelease(extension)
parce que vous avez transféré la propriété à l'ARC dans le__bridge_transfer
àext
.CFBridgingRelease
, il ne__bridge_transfer
, mais je suppose que Apple a recommandé la nouvelle syntaxe pour une raison. Je ne sais pas si c'est pour des raisons de lisibilité, ou s'ils ont quelques ambitions futures pourCFBridgingRelease
. Chacun est beau, j'en suis sûr, cependant.Découvrez WWDC 2012 - Moderne Objective-C qui décrit les nouvelles lignes directrices pour les principaux objets de la Fondation et de l'ARC. C'est environ 37:35 dans cette vidéo. En bref, Fondement de Base des fonctions avec
Copy
ouCreate
dans le nom de créer un objet qui a transféré la propriété à votre application, et votre application est responsable de la relâcher.De toute façon, si la propriété a été transférée par l'intermédiaire d'un Fondement de Base de la méthode avec
Copy
ouCreate
dans le nom, vous pouvez libérer manuellement avecCFRelease
lorsque vous avez terminé avec lui, ou, plus facile, vous pouvez transférer la propriété à l'ARC et qu'elle prenne soin d'elle. Historiquement, le transfert de propriété à l'ARC, nous avons utilisé__bridge_transfer
, mais ils recommandent maintenantCFBridgingRelease
(même si ce dernier est juste une macro pour l'ancien). Et, évidemment, si vous avez quelques Fondement de Base de l'objet que vous avez récupéré via un autre mécanisme autre qu'une fonction avecCopy
ouCreate
dans le nom, vous ne devez niCFRelease
, ni en transférer la propriété à l'ARC.À titre d'illustration, cette méthode accomplit ce que vous voulez:
En général, je pense que vous devriez essayer de commentaire de la première CFRelease(type mime) en ligne, et décommentez les deux lignes: CFRelease(uti) et CFRelease(extension). Vous lancez un appel gratuit pont à l'entrée NSString et ARC poignée de la libération. Mais l'uti et de l'extension est créé, copié, comme CFString. L'ARC ne savent pas comment les gérer (souvenez-vous de l'ARC est un compilateur en fonction de NSObject), alors vous avez besoin pour CF les libérer.