CFStringRef到NSString ARC泄漏。 为什么?

我一直在寻找从CFStringRef到ARC的NSString的正确方法,以避免内存泄漏,一些主要投票答案build议:

 NSString * string = (__bridge NSString *)cfString; 

我在这里使用这种方法,但是在分析应用程序时,我仍然在这个小方法中发现内存泄漏[见附图]。

所以,我不知道如何解决这个问题。 有人有解决这个问题?

谢谢

在这里输入图像说明

在这里输入图像说明

所以,显然在返回之前添加了CFRelease(ext)修复了漏洞。 问题是我不认为我完全理解了原因。 我认为这一行:

 NSString * extension = (__bridge NSString*)ext 

将获得核心基金会分机string的所有权,并处理该版本。 任何人都可以解释这里究竟发生了什么?

根据事实上的“标准”Cocoa命名约定,包含名称中的CreateCopy函数返回一个引用计数为1的对象。您必须将该引用计数传送到ARC-land中,以便ARC可以处理它。 为此,您使用__bridge_transfer关键字。

 NSString *string = (__bridge_transfer NSString *)cfString; 

释放ext对象或使用__bridge_transfer

让我以我理解的方式解释一下:

  • __bridge – 正常铸造。 铸造对象的保留数量部分由ARCpipe理,部分由人工pipe理。 您需要释放CF方面的现有所有权。

  • __bridge_transfer – “将CF对象转换为NS对象”。被转换对象的保留计数由ARC完全pipe理。 现有的CF方面的所有权将为您处理。