Automatic Retain Counting (ARC)
Objective-C와 Swift에서 사용하는 메모리 관리 방법으로, retain count를 추적해야하는 번거로움을 개발자가 아닌 컴파일러에게 일임하는 것이다.본래의 Objective-C에서는 'retain'과 'release' 메시지를 사용함으로써 객체를 해제할지 말지를 표시했다. ARC에서는 컴파일러가 소스코드를 검사하여 컴파일된 코드 안에 'retain'과 'release' 메시지를 추가한다.
ARC가 코코아의 garbage collection과 다른 점은 객체를 해제하기 위한 background-process가 별도로 존재하지 않는다는 점이다. 그리고 ARC는 Retain Cycle에 대해 자동적으로 대응할 수 없다. 그래서 개발자는 'weak'을 이용하여 Retain Cyle을 방지해야 한다.
ARC를 사용할 때, 주의
- in Objective-C
* ARC를 사용 중일 때는 'retain', 'release', 'retainCount', 'autorelease', 'dealloc' 등을 호출할 수 없다.
* 'id'와 'void *'간의 type casting을 할 수 없다. 'id'는 Foundation 객체이고 'void *'는 Core Foundation 객체에 포함되어 다르기 때문이다. 컴파일러에게 각 객체의 특성에 따른 life time을 알리기 위해 특별한 type casting이나 function을 사용해야 한다.
* C 구조체 안에서 객체 포인터를 사용할 수 없다.
* 'NSZone'과 같은 메모리 존을 사용할 수 없다.
* non-ARC 코드와 혼용하기 위해서는 copy로 시작하는 함수나 별도의 getter를 사용하지 않는 property를 사용할 수 없다.
- in Swift
* Swift에서는 Strong Reference Cycles을 방지하기 위해 'weak', 'unowned' 키워드를 제공한다. Weak reference는 optional value여야 한다. (참조 : Swift 3주차 요약)
* 클래스 안의 클로저는 self reference를 capturing하여 Strong Reference Cycles을 발생시킬 수 있다. 이 때문에 capture list를 사용하여 self reference를 'weak'이나 'unowned'로 사용해야 한다. (참조 : Swift 3주차 요약)
'Programming > Mac & iOS' 카테고리의 다른 글
[iOS] Initialization과 Literal (0) | 2016.05.16 |
---|---|
[iOS] App Extensions in iOS (0) | 2016.04.30 |
[iOS] 스레드(Thread) 사용법 & Tips (0) | 2016.04.24 |
[iOS] NULL, nil, Nil, NSNull (0) | 2016.04.21 |
[iOS] self와 _의 차이 (0) | 2016.04.21 |