ARC和CFRelease? [英] ARC and CFRelease?

查看:557
本文介绍了ARC和CFRelease?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有点困惑。我读过的每个地方都建议,在使用ARC时,你仍然需要释放有意义的核心基础对象,ARC不管理它们。但是,我有一个方法,它使用了一些CF方法/​​对象,我使用了 CFRelease ,但这导致应用程序崩溃。取消注释我的 CFRelease 修复了这个问题,但后来我假设我有内存泄漏?



可能有人请说明哪些东西需要发布,哪些不需要,或者这个代码有什么问题?

  +(NSString * )fileExtensionForMimeType:(NSString *)类型
{
CFStringRef mimeType =(__ bridge CFStringRef)type;
CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,mimeType,NULL);
CFStringRef extension = UTTypeCopyPreferredTagWithClass(uti,kUTTagClassFilenameExtension);

NSString * ext =(__ bridge NSString *)扩展名;

// CFRelease(mimeType);
// CFRelease(uti);
// CFRelease(扩展名);

返回分机;
}

三个已注释 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 *)扩展名;

// CFRelease(mimeType); //如果(uti)CFRelease(uti),则不拥有
;
// CFRelease(扩展名); //所有权已转让

return ext;
}


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. However, I've got a method which uses some CF methods/objects which I used CFRelease on, but that then caused the app to crash. Uncommenting my CFReleases fixes the issue but then I'm assuming I've got a memory leak?

Could someone please explain which things need releasing and which don't, or anything else that's wrong with this 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;
}

The three commented out CFRelease calls fix the issue as mentioned, but I know it's wrong. What should I be doing?

解决方案

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

这篇关于ARC和CFRelease?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆