ARC에 대해서 알아보기
2022. 11. 15. 21:53ㆍ면접준비
ARC란 무엇인가요?
- 자동으로 메모리를 관리해주는 방식입니다.(자동으로 레퍼런스를 카운팅 해준다)
- 프로그래머가 메모리 관리에 신경을 덜 쓸 수 있기에 편리합니다.
- 더이상 필요하지 않은 클래스의 인스턴스를 메모리에서 해제하는 방식으로 동작합니다.
ARC를 왜 이해해야할까요?
- 언제 메모리가 해제가 되는걸 알기 위해서?? ( 다른 참조 부분이있을수도있어서?)
- 자동으로 해주긴하지만 어떤식으로해주는지에 대해서 알고있어야해서??
ARC는 어떻게 동작하나요?
- ARC가 컴파일 시점에 클래스의 생성, 소멸 등에 맞춰서 저장한다.
- 새로운 class 인스턴스를 생성할때마다, ARC는 해당 인스턴스의 정보를 적재하기 위해 메모리의 chunk(덩어리)를 할당한다.
- 이 메모리는 인스턴스 타입에 대한 정보를 해당 인스턴스와 관련되어 저장된 프로퍼티들의 값을 함께 포함하여 유지한다.
- 인스턴스가 더이상 필요하지 않게 될때, ARC는 해당 인스턴스에 의해 사용되는 메모리를 해제하고 해제 된 해당 메모리는 다른 목적을 위해 사용될 수있게됩니다.
- 더이상 필요하지않게 될 떄 메모리를 차지 않도록 보장한다.
강한 순환 참조 에 대해서
- ARC에서 참조카운터를 증가시키는 것은 강한 참조라고 한다.
- 직접 카운트를 감소시켜주지 않으면 카운트가 내려가지 않습니다.
강한 참조 사이클
-클래스의 인스턴스가 강한 참조가 없는 지점에 도달하지 않는, 쉽게 말하면 인스턴스를 더 이상 사용하지 않아도 참조를 유지하는 코드를 작성 가능한데 이것을 강한 참조 사이클 이라고 한다.
클래스 간 일부 관계를 강한 참조 대신 약한 또는 미소유 참조로 정의해서 강한 참조 사이클을 해결할 수 있다.
Weak와 Strong에 대해 설명하세요. ( + unowned)
- Strong(강한참조) - strong은 객체를 소유하여 레퍼런스 카운트가 증가하는 프로퍼티이다. 값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다.
- Weak(약한참조) - weak은 객체를 소유하지 않고 주소값만을 가지고 있는 포인터 개념이다. 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다. 값 지정시 리테인이 발생하지 않는다. 따라서 릴리즈도 발생하지 않는다. 그래서 언제 어떻게 메모리가 해제될 지 알 수가 없다. 다만 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화를 해 준다. 그렇기 때문에 Weak 속성을 사용하는 객체는 항상 옵셔널타입이여야 한다.
- Unowned(미소유 참조) - weak와 매우 비슷한 역할을 한다. 차이점으로는 Unowned로 선언된 변수는 nil이 될수가 없습니다. 그러므로 Unowned 변수는 옵셔널로 선언되어서는 안된다. 해제된 메모리 영역을 접근하지 않는다는 확실한 경우에만 사용해야한다.
어느 상황에 사용하는가
- strong - 레퍼런스 객체가 할당되는 순간 해당 객체의 레퍼런스 카운트를 증가 시킨다. 레퍼런스 카운트를 증가시켜 ARC로 인한 메모리 해제를 피하고 객체를 안전하게 사용하고자 할 때 쓰인다.
- weak - 객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다. 이 키워드는 Optional 타입에만 적용이 된다. 객체가 ARC에 의해 해제가 되면 nil 값이 할당된다. 대표적으로 retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, iOS 프레임워크에서 대표적인 예로는 Delegate패턴이 있다.
- unowned - 객체가 할당될 때 레퍼런스 카운트를 증가시키지 않는다. 그러나 Non-Optional 타입으로 선언되어야 하며, 객체가 ARC에 의해 메모리해제가 되더라도, 해당 객체 값을 존재하는 것으로 인지하며, 해당 객체에 액세스 할 경우 런타임 오류를 발생시킨다. 객체의 라이플사이클이 명확하고 개발자에 의해 제어 가능이 명확한 경우 , weak Optional 타입 대신 사용하여 좀더 간결한 코딩이 가능하다.
Strong Reference
Reference count를 1 증가시킴
참조 카운트 감소시키려면 직접 해제하여 감소해줘야 함
Strong Referece Cycle 발생시킬 수 있음
Weak Reference
Reference count에 영향을 주지 않음
Strong Referece Cycle 해결할 수 있음
자신보다 덜 오래갈 인스턴스에 사용
런타임 중에 변할 수 있기 때문에 변수로만 선언 가능
런타임 중 nil로 변할 수 있기 때문에 옵셔널로 선언되어야 함
Unowned Reference
Reference count에 영향을 주지 않음
Strong Referece Cycle 해결할 수 있음
자신보다 오래갈 인스턴스에 사용
nil이 되지 않음
'면접준비' 카테고리의 다른 글
접근제어자에 대해서 (0) | 2022.11.22 |
---|---|
오버라이드(override), 클래스 함수(class func) 차이에 대해서 (0) | 2022.11.20 |
리스폰더 체인에 대해서 (0) | 2022.11.12 |
REST API의 개념과 사용 이유에대해 설명하시오. (0) | 2022.11.11 |
프로세스와 쓰레드에 대해서. (0) | 2022.11.10 |