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 CFReleases 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!
InformationsquelleAutor PaReeOhNos | 2012-12-28