CFStringRef到NSString ARC泄漏。 为什么?
我一直在寻找从CFStringRef
到ARC的NSString
的正确方法,以避免内存泄漏,一些主要投票答案build议:
NSString * string = (__bridge NSString *)cfString;
我在这里使用这种方法,但是在分析应用程序时,我仍然在这个小方法中发现内存泄漏[见附图]。
所以,我不知道如何解决这个问题。 有人有解决这个问题?
谢谢
所以,显然在返回之前添加了CFRelease(ext)
修复了漏洞。 问题是我不认为我完全理解了原因。 我认为这一行:
NSString * extension = (__bridge NSString*)ext
将获得核心基金会分机string的所有权,并处理该版本。 任何人都可以解释这里究竟发生了什么?
根据事实上的“标准”Cocoa命名约定,包含名称中的Create
或Copy
函数返回一个引用计数为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
方面的所有权将为您处理。