我有点困惑。我所读过的所有地方都建议使用ARC时,您仍然需要释放有意义的核心基础对象,而ARC不对其进行管理。但是,我有一个使用某些CF方法/​​对象的方法,我在上面使用了CFRelease,但随后导致该应用程序崩溃。取消注释我的CFRelease可以解决此问题,但是我假设我发生了内存泄漏?

有人可以解释一下哪些内容需要发布,哪些不需要,或者此代码有什么其他问题吗?

+ (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;
}

三个注释掉的CFRelease调用解决了上述问题,但我知道这是错误的。我该怎么办?

最佳答案

您不拥有mimeType,因此无法释放它。您没有使用__bridge转换所有权。

由于已创建uti,因此应将其释放。

由于还创建了extension,因此您也应该释放它,但这可能会导致ext出现问题。而是将所有权转让给ext

我建议以下内容:

+ (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;
}

关于objective-c - ARC和CFRelease?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14064336/

10-13 05:58