ARC and CFRelease?

前端 未结 3 2085
天涯浪人
天涯浪人 2020-12-24 12:08

I\'m slightly confused. Everywhere I\'ve read, suggest that when using ARC, you still need to release core foundation objects which makes sense, ARC doesn\'t manage them. Ho

3条回答
  •  离开以前
    2020-12-24 12:13

    You can't release mimeType because you don't own it. You didn't transfer ownership with the __bridge cast.

    You should be releasing uti since you have created it.

    You should also release extension since you created it as well, but that will likely cause issues with ext. Instead, transfer ownership to ext.

    I'd suggest the following:

    + (NSString *) fileExtensionForMimeType:(NSString *)type {
        CFStringRef mimeType = (__bridge CFStringRef)type;
        CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL);
        CFStringRef extension = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension);
    
        NSString *ext = (__bridge_transfer NSString *)extension;
    
        // CFRelease(mimeType); // not owned
        if (uti) CFRelease(uti);
        // CFRelease(extension); // ownership was transferred
    
        return ext;
    }
    

提交回复
热议问题