ARC

위클립스
이동: 둘러보기, 찾기

[편집] Bridged Cast

ARC 이전에는 아래와 같이 ObjC 세상에서 C세상 쪽으로 오너십을 넘기는 것이 가능했다.

NSString* aStr = ...;
 
CFStringRef cfStringRef = (CFStringRef) aStr;
 
// C쪽에서 레퍼런스 카운트를 증가.
CFRetain(cfStringRef);
 
// ObjC에서 레퍼런스 카운트 감소.
[aStr release];

그러나 ARC를 사용하는 경우, retain이나 release를 호출 할 수 없으므로, 이를 해결하기 위해 브릿지 캐스팅이 소개되었다.


[편집] __bridge_transfer

__bridge_transfer 는 C포인터를 NS타입 포인터로 캐스팅 할 때 사용된다. ARC 컴파일러는 캐스팅 표현식이 사용된 스코프가 종료되는 시점에 C포인터의 레퍼런스 카운트를 감소시키는 코드를 삽입시킨다.

용례:

-(void) test
{
  CFStringRef cfStrRef = ...;
  NSString* aStr = (__bridge_Transfer NSString*) cfStrRef;
  NSLog(@"%@", aStr);
}

위의 코드는 아래의 코드와 같이 작동하게 된다:

-(void) test
{
  CFStringRef cfStrRef = ...;
  NSString* aStr = (__bridge NSString*) cfStrRef;
  NSLog(@"%@", aStr);
  CFRelease(cfStrRef);}

[편집] __bridge_retained

__bridge_retained는 NS타입 포인터를 C타입 포인터로 캐스팅할 때 사용된다. 레퍼런스 카운트를 1 증가시켜주는 것 외에는 딱히 특별할 것이 없다. 레퍼런스 카운트가 증가되었으므로 리시버는 밸런스를 맞출 책임을 져야 한다.

용례:

NSString* aStr = ..;
CFStringRef cfStrRef = (__bridge_retained) aStr;

아래와 같이 작동한다:

NSString* aStr = ..;
CFRetain((__bridge CFStringRef) aStr);CFStringRef cfStrRef = (__bridge) aStr;
원본 주소 ‘http://eclipse.or.kr/wiki/ARC
개인 도구
이름공간
변수
행위
포탈
탐색
도움
도구모음