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

use*_*951 2 objective-c clang-static-analyzer automatic-ref-counting

CFArrayRef refAllPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
NSArray * arPeople = (__bridge_transfer NSArray*)(refAllPeople);
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以,

为什么内存泄漏投诉?

Gab*_*lla 6

你的理解是正确的.__bridge_transfer将refAllPeople回到的世界NSObject在那里ARC工作,你不必显式调用CFRelease.

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

来自文档(感谢卡尔)

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

  • 从clang文档:"(__ bridge_transfer T)op将操作数(必须具有不可保留的指针类型)强制转换为目标类型,该类型必须是可保留的对象指针类型.ARC将在封闭的完整的末尾释放值 - 表达式,取决于对本地值的通常优化." 这意味着与你所说的相反. (2认同)