有一个例子:
{
CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 1000, CFSTR("Hello World") );
NSString *value = (__bridge_transfer NSString *)str ;
NSLog(@"%@", value) ;
CFRelease(str) ; // crash here
}
我知道我不应该释放str,因为所有者关系已转移到value
,但在WWDC 2013视频Fixing Memory Issues
中,有一张图片,似乎在使用时{{1} },它会将原始对象的保留计数增加1,我很困惑,任何人都可以帮忙吗?
答案 0 :(得分:0)
使用__bridge_transfer
您将所有权从CoreFoundation转移到ARC。这也等同于调用CFBridgingRelease(str)
。这实际上将对象从CoreFoundation移动到ARC的世界,ARC将负责释放对象。因此,您不会,也不得在CFRelease()
上致电CFMutableStringRef
。
但是,您也可以使用不会触及对象所有权的__bridge
(没有转移)。在这种情况下,您将负责使用CFRelease()
;