CFStringRef到NSString ARC泄漏。为什么?

时间:2013-07-31 10:08:54

标签: ios memory-leaks nsstring automatic-ref-counting

我一直在寻找在ARC中从CFStringRefNSString的正确方法,以避免内存泄漏,并提出一些主要的投票答案:

NSString * string = (__bridge NSString *)cfString;

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

所以,我不知道如何解决这个问题。任何人都有解决这个问题的方法吗?

谢谢

enter image description here

enter image description here

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

NSString * extension = (__bridge NSString*)ext

将取得Core Foundation ext字符串的所有权并处理该版本。 任何人都可以解释这里到底发生了什么吗?

2 个答案:

答案 0 :(得分:6)

根据事实上的“标准”Cocoa命名约定,名称中包含CreateCopy的函数返回引用计数为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方面的现有所有权是为您处理的。