본문 바로가기
프로그래밍 놀이터/iOS

[ios] ARC 와 Toll-free bridging

by 돼지왕 왕돼지 2017. 10. 29.
반응형

 [ios] ARC 와 Toll-free bridging


arc, CFBridgingRelease, CFBridgingRetain, CFRelease, CFStringRef, core foundation, core foundation arc, Cost, nsobject, NSString, object, Objective-C, toll-free bridging, [ios] ARC 와 Toll-free bridging, __bridge, __bridge_retained, __bridge_transfer, 개발자, 메모리 관리 주체, 메모리 관리 주체 이전, 메모리 해지 책임, 수동 메모리 관리, 타입 캐스팅


Toll-Free Bridging


-

ARC 는 Objective-C 의 Object 만을 대상으로 한다.

Core Foundation 범주의 Object 들은 대상이 아니다.



-

Core Foundation API 를 사용할 경우 개발자가 수동으로 메모리 관리를 해야 한다.

CoreFoundation <-> Objective-C 클래스간의 타입 캐스팅을 할 수 있으며,

이 때 아무런 cost 없이 작업을 할 수 있다 하여 Toll-Free bridging 이라고 부른다.



-

Toll-Free bridging 을 할 때 주의할 점은 메모리관리 주체를 이전하느냐 마느냐이다.




__bridge


-

Objective-C Object <-> Core Foundation 변환하고 싶을 때 사용한다.

대부분은 Objective-C Object -> Core Foundation Object 로 변환할 때 사용하며, 이 때  ARC 가 메모리 해지 책임을 그대로 가지고 있는다. ( 반대의 경우 Core Foundation 이 메모리 해지 책임을 갖는다. )


아래와 같은 문법을 갖는다.

(__bridge CFStringRef)NSString

(__bridge NSString)CFStringRef




__bridge_transfer


-

Core Foundation 에서 NSObject 로 타입 캐스팅 하는 경우 사용한다.

이 녀석은 NSObject 타입으로 캐스팅을 하면서 메모리 관리 책임을 ARC 에게 넘겨버린다.

NSString* string = (__bridge_transfer NSString*)aCFStringRef



-

CFBridgingRelease() 라는 함수는 __bridge_transfer 를 대신할 수 있다.

즉, 다음과 같이 쓰는 것은 위와 완전 동일한 구문이다.

NSString* string = CFBridgingRelease(aCFStringRef);




__bridge_retained


-

NSObject 타입을 Core Foundation 타입으로 캐스팅하는 경우 사용한다.

__bridge 와 다른 점은 메모리 해지 책임이 ARC 가 아니게 된다.

CoreFoundation 타입으로 변환된 객체에 대한 메모리 해지 책임이 개발자에게 주어지며

CFRelease() 를 통해 수동으로 관리해주어야 한다.

CFStringRef aStringRef = (__bridge_retained CFStringRef)aString;

...

CFRelease(aStringRef)



-

CFBridgingRetain() 라는 함수는 __bridge_retained 를 대신할 수 있다.

즉, 다음과 같이 쓰는 것은 위와 완전 동일한 구문이다.

CFStringRef aStringRef = CFBridgingRetain(aString);




반응형

댓글