-
iOS의 메모리 관리 - strong / weak / unowned🧑💻/Swift 2021. 5. 8. 17:36반응형
iOS의 메모리 관리
ARC(Automatic Reference Counting)
컴파일 시 자동으로 retain, release 코드를 추가해 줍니다.
인스턴스가 생성되면 정보를 저장하기 위해 메모리를 힙에 할당합니다.
인스턴스를 참조하는 프로퍼티의 갯수(retain count)를 체크하고, 참조 횟수가 0이 되면 메모리에서 해제합니다.
strong vs weak vs unownedstrong (default) weak unowned 구분 강한 참조 약한 참조 약한 참조 / 미소유 참조 소유권 O X X 참조 시 retain count 증가 O X X optional non-optional 메모리 해제 retain count가 0이면 해제됨. 객체를 추적하여 해제 시 nil로 변경 해제 후 참조 시 BAD ACCESS 장점 retain count로 관리하여 객체를 안전하게 사용할 수 있음. 순환 참조에 의한 메모리 누수 문제를 해결할 수 있음. 완벽하게 관리할 수 있다면 간결한 코딩이 가능함. 단점 순환 참조 발생 가능 객체를 추적하기 때문에 오버헤드 발생 개발자의 실수로 인해 오류 발생
Delegate 패턴에 weak가 사용되는 이유FirstViewController에서 SecondViewController 객체를 생성하고,
SecondViewController의 delegate 변수가 FirstViewController를 참조할 때 서로를 참조하는 순환 참조가 발생합니다.
이 때 SecondViewController의 delegate 변수를 weak로 선언 시 참조 횟수를 세지 않기 때문에 순환 참조 문제를 해결할 수 있습니다.
클로저 블럭 내 [weak self] inweak 특성 상 참조 횟수를 카운트하지 않고 메모리 해제 시 nil로 변경하기 때문에, ARC에 의한 순환 참조를 막을 수 있습니다.
용어 정리Retain Cycle (순환 참조) : 객체 서로가 참조하고 있어 메모리가 해제되지 않는 현상입니다. ARC는 순환 참조에 대해 처리하지 않습니다.
Dangling pointer (허상 포인터) : 참조하던 객체의 메모리가 해제되어 할당되지 않는 공간을 바라보는 포인터
참고
반응형