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