gpt4 book ai didi

objective-c - ARC 和 CFRelease?

转载 作者:IT王子 更新时间:2023-10-29 07:45:58 24 4
gpt4 key购买 nike

我有点困惑。我读过的所有地方都建议在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com