자동으로 관리된다고 방심하면 안됨.

hyun·2025년 7월 2일
0

iOS

목록 보기
25/54

 메모리 관리에서

 1. 메모리는 한정 자원

메모리는 무한하지 않아서 쓰지 않는 데이터는 꼭 치워야 함
자동 청소 시스템(GC, ARC)이 있어도 신경 써야 할 부분이 있음

 2. 언어마다 메모리 관리 방식이 다름

Java는 GC를 사용하는데
개발자가 직접 메모리를 해제하지 않아도 되지만 대신 Garbage Collector라는 시스템이 백그라운드에서 동작하면서 사용되지 않는 객체들을 자동으로 찾아서 메모리에서 제거해 줌

Garbage Collector는 메모리를 스캔하면서 참조하지 않는 객체가 있는지 확인하고 있으면 제거함
→ 개발자가 메모리 관리를 신경 쓰지 않아도 되지만 GC가 작동할 떄 성능이 느려질 수도 있음

Swift는 ARC를 사용하는데
객체가 몇 개의 참조를 받고 있는지 숫자로 세는 방식임

객체가 생성될 때 참조 카운트가 1로 시작하고 다른 변수나 상수가 객체를 참조하면 카운트가 올라감 (반대로 어떤 참조가 사라지면 카운트가 내려감)
참조 카운트가 0이 되는 순간 객체가 사용되지 않는다고 판단하고 자동으로 메모리를 해제함

GC처럼 전체 메모리를 훑지 않기 때문에 성능적으로 유리한 면이 있지만 순환 참조(서로가 서로를 참조하는 구조)가 생기면 참조 카운트가 0이 되지 않아서 메모리가 해제되지 않을 수 있음 그래서 weak이나 unowned 같은 걸로 순환 참조를 방지함

 3. 참조 수 관리

객체는 누군가 참조하고 있을 때만 살아 있음 (RC > 0)

참조가 0이 되면 자동으로 메모리에서 해제됨 (deinit 호출)

Reference Count

개발자가 객체를 제거하지 않아도 참조만 잘 끊으면 메모리는 자동으로 정리됨

 4. 약참조로 순환 참조를 피하기

서로가 서로를 참조하는 구조 (A → B, B → A)는 순환 참조로 인해서 메모리 누수를 유발하게 됨

피하려면 한쪽 참조를 weak로 선언해야 함 → 이러면 RC가 올라가지 않음

delegate 패턴에서는 항상 weak을 사용함

 5. 클로저 캡처 주의

클로저가 외부 객체를 참조하면 해당 객체의 RC가 증가함 → 클로저가 메모리 해제를 방해할 수 있음

그래서 [weak self] 를 클로저 앞에 붙여야 함

->>> ARC는 순환 참조에는 무력함
약참조, 클로저의 참조 방식으로 메모리 누수를 막을 수 있음

0개의 댓글