Mike Ash说:


  在强制转换中使用__bridge_transfer时,它告诉ARC该对象已被保留,并且ARC不需要再次保留它。由于ARC拥有所有权,因此完成后仍会释放它。


lang文件说明:


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


在Clang文档中没有任何地方说__bridge_transfer避免了两次保留。它仅表示该对象在将来的某个时间释放。

为什么这么重要?考虑以下代码片段:

NSString *value = (__bridge_transfer NSString *)CFPreferencesCopyAppValue(CFSTR("someKey"), CFSTR("com.company.someapp"));


CFStringRef以+1的keepCount开始。将其分配给value时,将再次保留CFStringRef,因为默认情况下强烈引用value。这导致双重保留。在作用域的末尾,将-release发送到value,但没有其他方法可以平衡CFPreferences * Copy * AppValue的持久保留,从而导致内存泄漏。

__bridge_transfer如何避免重复保留?

最佳答案

Clang的文档同意Mike Ash的观点。它说它执行了强制转换,并且对象在范围的末尾被释放。投放期间不会执行任何保留。

基本上,(__bridge_transfer T)会将值视为类型为T的已拥有值,就像调用[T new]会返回类型为T的已拥有值一样。

关于objective-c - __bridge_transfer的描述相互矛盾;避免双重保留吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11620836/

10-13 09:17