首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对__bridge_transfer的描述相互矛盾;它是否避免双重保留?

对__bridge_transfer的描述相互矛盾;它是否避免双重保留?
EN

Stack Overflow用户
提问于 2012-07-23 21:31:25
回答 2查看 839关注 0票数 1

迈克·阿什说:

当在强制转换中使用__bridge_transfer时,它会告诉ARC这个对象已经被保留了,并且ARC不需要再次保留它。因为ARC拥有所有权,所以当它完成时,它仍然会释放它。

Clang文档说:

(__bridge_transfer T) op将操作数(必须具有不可保留的指针类型)转换为目标类型,目标类型必须是可保留的对象指针类型。弧形将在封闭的全表达式结束时释放值,这取决于通常对局部值的优化。

在Clang文档中,没有任何地方说__bridge_transfer避免双重保留。它只说这个对象在将来某个时候会被释放。

这有什么关系?考虑以下代码片段:

代码语言:javascript
复制
NSString *value = (__bridge_transfer NSString *)CFPreferencesCopyAppValue(CFSTR("someKey"), CFSTR("com.company.someapp"));

CFStringRef以+1的retainCount开头。当它被赋值时,CFStringRef再次被保留,因为默认情况下,value是强引用的。这导致了双重保留。在作用域的末尾,-release被发送到value,但是没有其他东西来平衡CFPreferences*Copy*AppValue中挥之不去的保留,从而导致内存泄漏。

__bridge_transfer如何避免双重保留?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-23 21:36:29

Clang的文件与Mike一致。它表示它执行强制转换,并且在作用域的末尾释放该对象。在铸造过程中不执行保留。

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-23 21:48:04

当您使用"transfer“时,ARC会减少对象在其操作结束时的保留计数--因此,在本例中,您从计数1开始,"value”很强,因此它会增加计数,但是"transfer“会导致减少,因此最终返回1。

代码语言:javascript
复制
NSString *value = (__bridge_transfer NSString *)CFStringCreateMutableCopy(NULL, 1000, CFSTR("Hello World") );
NSLog(@"value retainCount %ld", CFGetRetainCount((__bridge CFTypeRef)value));
NSLog(@"Value = %@", value);

2012-07-23 17:45:49.421 TimeTester75918 75918:F 803值retainCount 1 2012-07-23 17:45:49.423 TimeTester75918 75918:F 803值= Hello

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11620836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档