최근 받았던 한가지 질문이 있다.
iOS에서 메모리 할당/해제는 어떤 방식으로 관리하는가??
해당 질문에 명확하게 답변을 하지 못하여🥹 iOS 메모리 할당/해제 방식에 대하여 학습하였다.
ARC = Automatic Reference Counting (그 전에는 MRC)
ios에서 메모리 관리를 단순화 + 효율화 하기 위해 도입된 기술이다.
개발자가 수동으로 메모리 할당 및 해제를 관리할 필요 없이 컴파일러가 자동으로 필요한 메모리 관리 코드를 추가한다
메모리 관리 측면에서 엄청난 장점을 가져다 주는 기능이다.
최근 프로젝트를 진행하며 많이 사용했던 것이 weak(약한참조)이다. 강한 참조와 약한 참조는 참조 카운트에 영향을 주는 방식에서 차이를 가지고 있다. 해당 차이점은?
그리고 하나가 더 있다.
weak와 unowned의 차이
댕글링 포인터(Dangling pointer) :
원래 바라보던 객체가 해제되면서 할당되지 않는 공간을 바라보는 포인터
위의 내용을 통해 참조 카운트가 0인 객체들이 결국 메모리에서 해제되어야 하는 객체임을 알 수 있었다. 이러한 메모리 관리는 메모리의 Heap영역에서 이루어진다. Heap영역은 참조타임의 데이터가 저당되고, 개발자가 동적메모리를 할당하는 공간이다.
하지만 정확한 해제 시점은 카운트가 0이되는 시점만 있는 것이 아니다.
그 전에 알아두면 좋은 것 -> retain, release함수(컴파일 시점에 자동으로 함수 넣어줌)
여기서 필요 없을 때의 시점은 RC가 0이 되었을 때 deinit메서드를 통해 메모리가 해제된다.
하지만 Runloop iteration 동안 사용 중이거나 retain/release호출이 중첩되어있는 경우 다음 runloop iteration까지 해제가 지연될 수 있습니다.
사용시 장점
autoReleasePool 블록 사용시 블록 종료되는 시점에서의 메모리 해제를 보장
-> 루프를 많이 돌아야 하는 경우 autoreleasepool을 명시적으로 선언하여 메모리를 최적화 할 수 있다.