CFArrayRef refAllPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
NSArray * arPeople = (__bridge_transfer NSArray*)(refAllPeople);
当我分析它时可能存在内存泄漏。
让我试着去理解。 refAllPeople有1个参考计数。
然后我做_ bridge _transfer。这将所有权转移给了我。更确切地说,它有arPeople指向它并将保留计数加1.然后保留计数减1,因为_ bridge _transfer等效于(__bridge)后跟CFRelease。
所以,
为什么内存泄漏投诉?
答案 0 :(得分:6)
您的理解是正确的。 __bridge_transfer
将refAllPeople
带回NSObject
ARC
所在的CFRelease
世界,您无需明确呼叫{{1}}。
我认为这是静态分析仪的错误。
来自文档(感谢Carl)
(__ bridge_transfer T)op将必须具有不可保留指针类型的操作数强制转换为目标类型,该目标类型必须是可保留的对象指针类型。 ARC将在封闭的完整表达式的末尾释放值,这取决于对本地值的通常优化。
答案 1 :(得分:1)
令人尴尬。没有内存泄漏:)。不知怎的,我误读了错误信息并认为所有蓝色事物都意味着内存泄漏。
我很高兴我对bridge_transfer的理解是正确的,我希望它对每个人都有用。
对于已经回答此问题的其他人,+1;)