CLOSE SEARCH

Automatic Reference Counting (ARC)

Automatic Reference Counting (ARC) 는 컴파일 시에 자동으로 적절한 위치에 retain, release, autorelease와 같은 메모리 관리와 관련된 메소드를 추가해 가비지 컬렉터와 유사하는 기능을 제공하는 기술이다.

ARC는 Mac OS X v10.6과 v10.7용 xCode 4.2 이상에서 개발할 수 있으며 iOS4와 iOS5에서 지원된다. 약한 참조(weak reference)의 경우 iOS5이상에서만 지원된다.

ARC를 사용하기 위해 아래와 같은 규칙을 따라야한다.

  • retain, release, retainCount, autorelease, dealloc을 명시적으로 호출하거나 구현할 수 없다. 특히 dealloc 메소드를 구현하는 경우 상위 클래스 호출은 컴파일러에서 수행하기 때문에 [super dealloc]를 호출할 필요가 없으며, 실제로 이 코드는 컴파일 에러를 발생시킨다.
  • alloc: 를 사용해서 객체를 생성한다. 객체의 해제는 런타임이 담당한다.
  • C 구조체 내부에서 객체 포인터를 사용할 수 없다. 대신 클래스를 사용한다.
  • id와 void* 를 암시적으로 형변환 해주지 않는다.  컴파일러에게 객체의 수명에 대해 알려주는 특별한 형변환을 사용해야 한다.
  • NSAutorelease 객체를 사용할 수 없다. 대신 더 효율적인 @autoreleasepool 블록을 사용한다.
  • 더 이상 메모리 존을 사용할 수 없으며, 사용한다고 하더라고 런타임에 의해 무시된다.
  • ARC를 사용하지 않는 이전 코드와 함께 사용할 경우 new로 시작하는 속성명을 사용할 수 없다.
ARC에는 객체의 수명을 지정하는 몇가지 새로운 lifetime qualifier와 zeroing weak reference를 제공한다. 약한 참조는 대상 객체의 수명에 영향을 주지 않지만, zeroing weak reference는 대상 객체가 해제되면 자동으로 nil값을 가지게 된다.
ARC는 이전 참조 카운팅 방식에서 발생하던 strong reference cycles(retain cycle) 문제를 방지해주지 않으므로 신중하게 사용해야 한다.
@property의 속성에 새로운 strong, weak 키워드를 사용할 수 있다. 참조카운팅 방식에서 사용하던 아래의 코드는

ARC를 사용해서 아래와 같이 작성한다.

또한, 아래의 코드는

아래와 같이 작성한다.

assign을 사용하는 경우 myObject의 대상 객체가 해제되면 댕글링 포인터가 되지만, weak의 경우 nil로 설정된다.(zeroing weak reference)

 

ARC는 아래와 같은 새로운 Variable Qualifier를 제공한다.

  • __strong  : 기본값
  • __weak : zeroing weak reference. 대상 객체가 해제되면 nil이 됨.
  • __unsafe_unretained : weak reference. 대상 객체가 해제되면 댕글링 포인터가 됨.
  • __autoreleasing : id* 형식의 인수가 리턴시에 자동적으로 해제되도록 지정.
함수 내부에서 __weak를 사용할 경우 해당 객체의 유효성에 주의해야 한다.

위의 코드를 xCode에서 입력해보면 “Assigning retained object to weak variable; object will be released after assignment” 경고가 발생한다. weak 변수에 retain된 객체를 할당하게 되면 해당 객체가 할당된 후에 해제된다는 것이다. 실제로 위의 코드에서 alloc로 생성한 NSString 객체는 string에 할당된 직후에 해제되므로 2번 라인에서는 string : (null)이 출력된다.

 

ARC는 새로운 방식으로 Autorelease Pool을 사용한다. 참조 카운팅 방식에서와 같이 NSAutoReleasePool 객체를 직접 사용할 수는 없다.

 

아웃렛을 선언하는 방식 역시 ARC를 사용하는 방식에 맞게 변경되었다. File’s Owner와 nil 파일의 최상위 객체들은 strong, 그 외의 객체들은 weak 가 되어야 한다.

ARC를 사용하는 경우 strong, weak, autoreleasing 스택 변수들은 자동적으로 nil로 초기화 된다.

ARC를 활성화 하기 위해서는 -fobjc-arc 컴파일러 플래그를 사용한다. 프로젝트에서 ARC를 기본적으로 사용하는 경우 특정 파일에 대해 참조 카운팅 방식을 사용할 수도 있는데 해당파일에 -fno-objc-arc 플래그를 사용하면 된다.

Filed under: iOS