我一直在寻找在ARC中从CFStringRef
到NSString
的正确方法,以避免内存泄漏,并提出一些主要的投票答案:
NSString * string = (__bridge NSString *)cfString;
我在这里使用这种方法,但在分析应用程序时,我仍然会在这个小方法中出现内存泄漏[见附图]。
所以,我不知道如何解决这个问题。任何人都有解决这个问题的方法吗?
谢谢
所以,显然在返回之前添加CFRelease(ext)
修复了泄漏。问题是我不认为我完全理解原因。我认为这一行:
NSString * extension = (__bridge NSString*)ext
将取得Core Foundation ext字符串的所有权并处理该版本。 任何人都可以解释这里到底发生了什么吗?
答案 0 :(得分:6)
根据事实上的“标准”Cocoa命名约定,名称中包含Create
或Copy
的函数返回引用计数为1的对象。您必须传输此引用计数进入ARC-land以便ARC可以处理它。您出于此目的使用__bridge_transfer
关键字。
NSString *string = (__bridge_transfer NSString *)cfString;
答案 1 :(得分:4)
发布ext
个对象或使用__bridge_transfer
。
让我以我理解的方式解释一下:
__bridge
- 正常投射。铸造对象的保留计数部分由ARC管理,部分由人工管理。您需要在CF
方面发布现有所有权。
__bridge_transfer
- “将CF
对象转换为NS
对象。”转换对象的保留计数由ARC完全管理。 CF
方面的现有所有权是为您处理的。