노블의 개발이야기

[IOS] ARC - Toll-Free Bridging 본문

iOS

[IOS] ARC - Toll-Free Bridging

더플러스 2015. 4. 23. 16:55


나는 이렇게 이해했다.

__bridge (CF -> NS)
// CFArrayCreate 함수에 의하여 레퍼런스 카운트 1
CFArrayRef cfArray = CFArrayCreate(...);
// array로 __bridge되면서 ARC에 의해 레퍼런스 카운트 2
NSArray *array = (__bridge NSArray *)cfArray;
// CFRelase에 의해서 레퍼런스 카운트 1
CFRelease(cfArray)

따라서 NSArray가 릴리즈 되어 사라질 때가 되면 cfArray도 레퍼런트 카운트가 0이 되어 함께 사라질 것이다.

__bridge (NS- > CF)
// 생성자에 의해 레퍼런스 카운트 1
NSArray *array = [NSArray array];
// cfArray로 __bridge되나 레퍼런스 카운트는 변동이 없다.
CFArrayRef cfArray = (__bridge CFArrayRef)array;

따라서 ARC에 의해 NSArray가 릴리즈 되어 사라질 때까지 cfArray도 유지될 것이다.

__bridge_retain (NS -> CF)
// 생성자에 의해 레퍼런스 카운트 1
NSArray *array = [[NSArray alloc] init];
// __bridge_retained에 cfArray에 리테인을 걸어주게 되어 레퍼런스 카운트 2
CFArrayRef cfArray = (__bridge_retained CFArrayRef)array;

따라서 NSArray가 릴리즈 되어도 CFArrayRef 에 레퍼런스 카운트가 하나 더 있기 때문에
CFArrayRef이 살아있는 동안 메모리가 해제되지 않는다.
사용이 끝나면 CFRelease로 릴리즈 해주어야 한다.

__bridge_transfer (CF -> NS)
// 생성자에 의해 레퍼런스 카운트 1
CFArrayRef cfArray = CFArrayCreate(...);
// __bridge_transfer에 의해 오너쉽이 array로 이동, 레퍼런스 카운트 1
NSArray *array = (__bridge_transfer NSArray *)cfArray;

아주 안정적인 모습이 된다. 
이제 NSArray 타입 인스턴스인 array는 ARC 제어 하에서 갑작스런 메모리 해제가 발생하지 않는다


'iOS' 카테고리의 다른 글

[iOS] XML Parser  (0) 2015.05.06
[iOS] GCD(Grand Central Dispatch) 사용하기  (0) 2015.04.23
[iOS] 네트워크 상태 체크  (0) 2015.04.23
[iOS] NSString에 URL Encoding과 URL Decoding 메소드 추가하기  (0) 2015.04.20
[iOS] NSUserDefaults  (0) 2015.04.17
Comments