2014-09-16 1 views
0

는 예입니다 : 내가 주인의 관계가 value로 전송하기 때문에 나는 STR을 해제하지 말아야 알고__bridge_transfer는 원본 객체를 유지합니까?

{ 
    CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 1000, CFSTR("Hello World")); 
    NSString *value = (__bridge_transfer NSString *)str ; 
    NSLog(@"%@", value) ; 
    CFRelease(str) ; // crash here 
} 

하지만, WWDC에서 비디오 Fixing Memory Issues는,이 그림이 보인다 2013 때 사용 __bridge_transfer 말 , 원래 개체의 보유 횟수를 1만큼 증가시킬 것입니다. 혼란 스럽습니다. 아무도 도와 줄 수 있습니까? enter image description here

답변

0

__bridge_transfer을 사용하면 CoreFoundation에서 ARC로 소유권이 이전됩니다. 또한 CFBridgingRelease(str)을 호출하는 것과 같습니다. 이것은 본질적으로 객체를 CoreFoundation에서 ARC의 세계로 이동시킵니다. 여기서 ARC는 객체를 해제 할 책임이 있습니다. 따라서 CFMutableStringRefCFRelease()으로 전화하지 않아야합니다.

그러나 객체의 소유권에 영향을주지 않는 __bridge (전송하지 않음)을 사용할 수도 있습니다. 이 경우 CFRelease()을 사용하여 출시해야합니다.

+0

답변을 주셔서 감사합니다. '본질적으로 CoreFoundation에서 객체를 해제하고 ARC를 통해 객체를 유지합니다.'이 줄이 중요합니다. 참조를 표시 할 수 있습니까? – KudoCC

+0

여기에 약간의 혼란이있을 수 있습니다. CoreFoundation 개체가 실제로 해제되지 않습니다. 'CFBridgingRelease() '에 대한 호출은 단순히 ARC가 객체에 release를 호출 할 책임이 있기 때문에 릴리스 호출을 모방합니다. 혼란을 피하기 위해 내 대답을 편집했습니다. 참조 : https://developer.apple.com/library/ios/documentation/corefoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html – dbart

+0

좋습니다만, 'CF + 1> ARC 관리 'id': __ bridge_transfer T' 사진에? – KudoCC