ARC和CFRelease? [英] ARC and CFRelease?
问题描述
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 CFRelease
s 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屋!