为什么我必须在__bridge_transfer之后调用CFRelease?

时间:2013-03-29 05:48:20

标签: objective-c automatic-ref-counting clang-static-analyzer

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

当我分析它时可能存在内存泄漏。

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

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

所以,

为什么内存泄漏投诉?

2 个答案:

答案 0 :(得分:6)

您的理解是正确的。 __bridge_transferrefAllPeople带回NSObject ARC所在的CFRelease世界,您无需明确呼叫{{1}}。

我认为这是静态分析仪的错误。

来自文档(感谢Carl)

  

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

答案 1 :(得分:1)

令人尴尬。没有内存泄漏:)。不知怎的,我误读了错误信息并认为所有蓝色事物都意味着内存泄漏。

我很高兴我对bridge_transfer的理解是正确的,我希望它对每个人都有用。

对于已经回答此问题的其他人,

+1;)