迈克·阿什说:
当在强制转换中使用__bridge_transfer时,它会告诉ARC这个对象已经被保留了,并且ARC不需要再次保留它。因为ARC拥有所有权,所以当它完成时,它仍然会释放它。
Clang文档说:
(__bridge_transfer T) op将操作数(必须具有不可保留的指针类型)转换为目标类型,目标类型必须是可保留的对象指针类型。弧形将在封闭的全表达式结束时释放值,这取决于通常对局部值的优化。
在Clang文档中,没有任何地方说__bridge_transfer避免双重保留。它只说这个对象在将来某个时候会被释放。
这有什么关系?考虑以下代码片段:
NSString *value = (__bridge_transfer NSString *)CFPreferencesCopyAppValue(CFSTR("someKey"), CFSTR("com.company.someapp"));CFStringRef以+1的retainCount开头。当它被赋值时,CFStringRef再次被保留,因为默认情况下,value是强引用的。这导致了双重保留。在作用域的末尾,-release被发送到value,但是没有其他东西来平衡CFPreferences*Copy*AppValue中挥之不去的保留,从而导致内存泄漏。
__bridge_transfer如何避免双重保留?
发布于 2012-07-23 21:36:29
Clang的文件与Mike一致。它表示它执行强制转换,并且在作用域的末尾释放该对象。在铸造过程中不执行保留。
基本上,(__bridge_transfer T)使值被视为T类型的已经拥有的值,就像调用[T new]将如何返回已经拥有的T类型的值一样。
发布于 2012-07-23 21:48:04
当您使用"transfer“时,ARC会减少对象在其操作结束时的保留计数--因此,在本例中,您从计数1开始,"value”很强,因此它会增加计数,但是"transfer“会导致减少,因此最终返回1。
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
https://stackoverflow.com/questions/11620836
复制相似问题