1

我一直在寻找正确的方法来CFStringRef避免NSString内存泄漏,一些主要的投票答案表明:

NSString * string = (__bridge NSString *)cfString;

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

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

谢谢

在此处输入图像描述

在此处输入图像描述

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

NSString * extension = (__bridge NSString*)ext

将拥有 Core Foundation ext 字符串的所有权并处理发布。谁能准确解释这里发生了什么?

4

2 回答 2

7

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

NSString *string = (__bridge_transfer NSString *)cfString;
于 2013-07-31T10:13:25.050 回答
4

释放ext对象或使用__bridge_transfer.

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

  • __bridge– 正常铸造。转换对象的保留计数部分由 ARC 管理,部分由手动管理。您需要释放现有的所有权CF

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

于 2013-07-31T10:13:18.407 回答