HulkCodeer의 기술 블로그

면접을 준비하다가 보게 된 기술 문제(ARC)!!

August 05, 2019 | 1 Minute Read

ARC는 어느 시점에 동작하나요?

ARC란 레퍼런스 카운팅의 관리를 알아서 해준다는 개념인데…

예전 Objective-C를 할때는 변수나 클래스를 copy, alloc, retain을 할 경우 레퍼런스 카운팅이라고 해서

+1이 되는 동작 방식이 있었다.

즉 클래스를 alloc/init 하는 코드가 있다고 한다면 그 클래스의 참조 카운트가 0에서 1이 된다는 것이다.

그래서 0에서 1이 된다는건 뭘 뜻하는건가 이것은 메모리상에 1이상이 되어 있는 것들은 메모리 해제가 안되서 계속 유지되고 있다는 것이다.

이게 뭘 뜻하는지 아주 쉽게 설명하고 싶은데…갑자기 생각난 상황 표현이 있다.

우리 집에는 전기비를 아끼시고자 항상 전기 코드를 다 뽑고 나가시는 어머니가 계신다.

나는 자주 깜빡해서 뽑지 않고 나가는데…우리 어머니는 개발자를 하셨으면 엄청 나셨을꺼다.

전기 코드를 뽑지 않으면 결국 누수 전력이 생기고, 전기세에 지대한 영향을 끼치게 된다.(어머니 죄송합니다.)

클래스를 alloc/init 한다는 것은 전기 코드를 꼽는 행동이고, 다시 뽑는것은 release를 함으로써 참조 카운트를 0으로 만드는 것이다.

그럼 누수 전력이 생기지 않듯 누수 메모리가 생기지 않을 것이다.

Objective-C에서는 이런한 행동들을 개발자가 직접 함으로써 메모리 관리를 했었다…아주 짜증날때가 많았었다…

이러한 방식을 MRR이라고 한다. 매뉴얼 리테인 릴리즈…라고 하는데 이런 단축어를 풀어서 쓰는건…퍼왔습니다…잘 못외워서 ㅠㅠ

그러던 어느날 apple에서 좀더 개발자가 코딩에만 집중하길 바랬는지 ARC라는 녀석이 생겼다.

ARC는 결국 개발자들이 alloc/release 하던것들을 자기가 알아서 해주겠다!! 라고 하는것인데…

내가 왜 이렇게 Objective-C의 MRR부터 설명을 했냐면 MRR은 결국 컴파일 시점에 검사를 한다.

개발자가 alloc/release를 짝을 잘 맞춰서 했는지 아니면 이미 release가 되었는데 그걸 다른데서 갖다 쓰는지 등등의

검사를 말이다. 근데 ARC는 이러한 작업들을 자기가 해준단다.

!!!!!!!!! 그럼 ARC의 동작 시점은 당연히 컴파일 시점이라는 결론이 나오게 된다 !!!!!!!!!