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


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

让我尝试了解。 refAllPeople具有1个引用计数。

然后我做_bridge_transfer。这将所有权移交给我。更确切地说,它指向arPeople并将保留计数加1。然后,由于_bridge_transfer等于(__bridge)后跟CFRelease,因此保留计数减少1。

所以,

为什么内存泄漏投诉?

最佳答案

您的理解是正确的。 __bridge_transfer将把refAllPeople带回到NSObject所在的ARC世界,您不必显式调用CFRelease

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

来自文档(感谢卡尔)


(__bridge_transfer T)op将必须具有不可保留指针类型的操作数转换为目标类型,该目标类型必须是可保留对象的指针类型。 ARC将在封闭的全表达式结束时释放该值,但要对本地值进行通常的优化。

10-08 12:16