iOS 메모리 관리 part3: live^Toll-Free Bridging

1363 단어
1. __bridge 원본은 어느 쪽, 어느 쪽에서 제거합니까
( bridge T)op: 컴파일러가 bridge에 있을 때 아무것도 하지 말라고 알려주기
// objc to cf
NSString *nsStr = [self createSomeNSString];
CFStringRef cfStr = (__bridge CFStringRef)nsStr;
CFUseCFString(cfStr);
// CFRelease(cfStr);    
//  Objc       
// cf to objc
CFStringRef hello = CFStringCreateWithCString(kCFAllocatorDefault, "hello", kCFStringEncodingUTF8);
NSString *world = (__bridge NSString *)(hello);
CFRelease(hello); //   
[self useNSString:world];
//  CF     

2. __bridge_retained 양쪽 다 없애야 돼요.
( bridge retained T)op: (ObjC가 CF를 돌릴 때 사용) 컴파일러가 bridge에 있을 때retain 대상을 알려주고 개발자는 CF 쪽에서 대상을 방출해야 한다.
// objc to cf
NSString *nsStr = [self createSomeNSString];
CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr;
CFUseCFString(cfStr);
CFRelease(cfStr); //   
//  Objc  Objc      +CF    

3. __bridge_transfer Objc 엔드 제거
( bridge transfer T)op: (CF가 ObjC로 전환될 때 사용) 컴파일러에게 CF 대상의 소유권을 이전하고 개발자가 CF 쪽에서 대상을 방출할 필요가 없음을 알려줍니다.
// cf to objc
CFStringRef hello = CFStringCreateWithCString(kCFAllocatorDefault, "hello", kCFStringEncodingUTF8);
NSString *world = (__bridge_transfer NSString *)(hello);
// CFRelease(hello);    
[self useNSString:world];
//  CF  Objc      +CF     

기사 참조: Toll-Free Bridging

좋은 웹페이지 즐겨찾기