2
CFArrayRef refAllPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
NSArray * arPeople = (__bridge_transfer NSArray*)(refAllPeople);

当我分析它说潜在的内存泄漏。

让我试着理解。refAllPeople 有 1 个参考计数。

然后我做_bridge_transfer。这将所有权转移给了我。更准确地说,它有 arPeople 指向它并将保留计数加 1。然后保留计数减 1,因为_bridge _transfer等价于 (__bridge) 后跟 CFRelease。

所以,

为什么内存泄漏投诉?

4

2 回答 2

6

你的理解是正确的。__bridge_transferrefAllPeople带回NSObjectwhereARC操作的世界,您不必显式调用CFRelease.

我相信这是一个静态分析器错误。

来自文档(感谢 Carl)

(__bridge_transfer T) op 将必须具有不可保留指针类型的操作数强制转换为目标类型,该目标类型必须是可保留对象指针类型。ARC 将在封闭的完整表达式的末尾释放该值,这取决于对局部值的通常优化。

于 2013-03-29T05:53:30.063 回答
1

这让人很难堪。没有内存泄漏:)。不知何故,我误读了错误消息,并认为所有蓝色的东西都意味着内存泄漏。

很高兴我对bridge_transfer的理解是正确的,希望对大家有用。

为其他回答过此问题的人 +1 :)

于 2013-03-29T06:06:09.637 回答