[ios] ARC 와 Toll-free bridging |
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);
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[ios/tutorial] Core Data - Creating a Managed Object Model (0) | 2017.11.02 |
---|---|
[ios] Nullable & NonNull annotation (0) | 2017.10.30 |
[objective c] 형변환 (0) | 2017.10.28 |
[ios] abstract class 만드는 방법 (0) | 2017.10.27 |
[ios] Solution for "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection" (0) | 2017.10.26 |
댓글