Archive/꼼꼼한 재은씨 시리즈

ARC(Auto Reference Counter) 시스템 - IBOutlet

lgvv 2021. 3. 8. 16:27

스토리보드에서 연결할 때, 강한참조 약한참조 - strong, weak가 있다.

 

이들을 제대로 이해하려면 ARC 시스템에 대해서 먼저 이해할 필요가 있다.

 

ARC란 쉽게 말해서 '변수를 몇 군데에서 저장하고 있는가?' 이다. - 운영체제나 시스템프로그래밍에서 file management 개념에서 비슷한 개념을 우리는 배운 적이 있다.

 

해당 변수를 어디선가 사용하면 +1 하고 사용이 끝나면 -1한다. 

어디선가 카운트가 0이 되면 변수를 사용하지 않는다는 뜻임으로 메모리를 회소하여 재사용 가능하도록 메모리 공간을 확보합니다.

 

strong 타입으로 선언된 아웃렛 변수에 어디선가 참조하면 그 순간 ARC가 추적 가능하도록 카운트가 +1 처리됩니다.

즉, 열 곳에서 사용하면 카운트는 +10이 되서 내가 7곳에서 사용을 중지하고 3곳에서 사용을 마저 한다면 카운트가 +3임으로 10곳에 해당하는 메모리가 헤제가 되지 않습니다. 

 

반면 weak 타입은 참조하더라도 ARC에서는 0으로 카운트 됩니다. 즉, 사용을 중지하면 즉시 메모리가 회수될 수 있다는 말입니다.

 

weak 타입이 필요한 경우는 주로, 메모리가 부족하거나, 순환 참조 오류가 발생할 때입니다. 먼저 메모리 부족에 대해서 이야기 해봅시다.

 

일반적으로는 메모리 부족 상황 발생시  뷰 컨트롤러에서 정의된 didReceiveMemoryWarning() 메소드가 호출됩니다. 

이 메소드가 호출되면 개발자들은 메인 뷰가 nil이 되도록 처리하는데, 이렇게 되면 메인 뷰 내부에서 weak 타입으로 선언된 모든 카운트 변수는 0이 되어서 삭제됩니다. 이를 통해 메모리를 확보할 수 있습니다.

 

만약 특정 변수를 strong으로 선언했다면, 그리고 그 변수의 카운트가 아직 0이 아니라면 메인 뷰가 nil이 되더라도 해당 변수는 삭제되지 않고 메모리에 그대로 남아 있게 됩니다. 즉, 메모리를 차지하고 있는, 이른바 메모리 누수 현상이 발생하는 겁니다. 이런 상황을 피하기 위해서 우리는 weak로 권장하고 있습니다.

 

또한 weak을 사용해야하는 이유는 순환 참조 오류가 발생할 수 있을 때입니다. 

두 개 이상의 객체가 서로를 강하게 참조하고 있어서 객체들이 메모리에서 해제될 수 없는 상황을 의미합니다. 

즉 a,b와 오브젝트가 서로서로 참조하고 있을때, strong을 쓰면 큰 문제가 발생할 수 있습니다

- 이런 이슈도 OS수업과 시스템프로그래밍에서 배운 적이 있습니다.