오늘은 메모리 관리에 대해서 공부를 해보려고 한다.
사실 지금까지 메모리 관리를 신경쓰면서 개발하지 않았는데, 많은 자료들을 찾아보니 자동으로 관리를 해주더라도
메모리 누수문제가 있으니 신경써서 개발하는 것이 좋다고 하길래... 정리를 해보려 한다.
*참고로*
프로그래밍에 있어서 메모리 관리는 매우 중요한데, 자동으로 처리해주는 것이 JAVA의 가비지 콜렉터와 Swift의 ARC가 있다. 두 언어 모두 컴파일러가 알아서 메모리 관리를 해주는 언어이다.
메모리 영역
메모리 관리는 가상메모리 4개의 영역 중 Heap 영역과 관련이 있다.
Heap 영역은 참조형 자료들이 머무는 공간으로 개발자가 동적으로 할당하는 메모리 공간으로 관리가 필요한 영역이다.
Swift에서 Heap 영역에는 class나 closure가 살고 있는 공간이다.
Swift ARC라는 자동 레퍼런스 카운팅이 메모리를 자동으로 관리를 해준다.
[강한참조]
*ARC 동작 방식 : 1. ARC는 클래스의 새 인스턴스를 만들때 적당한 크기의 메모리공간을 할당 한다.
2. 할당된 메모리를 참조할 때 마다 참조 횟수를 1 카운팅 한다.
3. 참조하지 않을때 -1을 카운팅
4. '0' 되면 메모리에서 해제 시킨다.
이렇게만 작동하면 좋겠지만, 참조에서 메모리가 절대 해제 되지 않는 경우가 발생해서, 그런 경우도 생각을 해주어야 한다.
위의 동작시, 카운트가 늘어나는게 강한참조라고 하는데, 기본 인스턴스 할당을 하면 강한참조가 된다. 이렇게만 돌아가게 되면 인스턴스 끼리 서로가 서로를 강한참조하게 될때 순환참조의 문제가 발생하게 된다.
강한참조를 해결하는 방법에는 두가지가 있는데 약한참조(weak)와, 미소유참조(unowned)가 있다.
먼저, 약한참조를 사용해서 메모리 해제를 해봤다.
[약한 참조]
- 약한참조는 값은 참조하지만, 소유하지는 않는다. -> 참조 횟수를 증가 시키지 않는다.
- weak 키워드로 명시한다.
- 약한참조는 nil이 될수 있으므로, 상수를 사용할 수 없고(var만 사용가능), 옵셔널 형태로 사용 해야한다.
위의 사진에서 보듯이 두 클래스가 서로 참조 하고 있을때, 한 곳에 weak 와 옵셔널을 넣으면 메모리 해제가 잘 되는 것을 확인 할 수 있었다. (60번째 줄 확인)
두번째로, 미소유참조 방식으로 해결을 해보았다.
[미소유 참조]
- 인스턴스의 참조 횟수를 증가시키지 않는다.
- 약한 참조와는 달리 참조하는 인스턴스가 메모리에 항상 존재한 다는 것을 전제로 작동한다.
- 인스턴스가 메모리에서 해제되어도 nil을 할당하지 않는다.
- 옵셔널일 필요가 없다.
- unowned 키워드를 사용하여 명시한다.
상위의 것이 참조가 없어지만 하위의 개념의 참조도 자동으로 없어진다. (미소유 방식은 어렵다...그냥은 이해가 잘 가지 않아서 개발할때 더 깊이 봐야 할 것같다..)
아무튼 오늘은 Swift 메모리 관리에 대해 정리를 했는데, 그냥 읽고 찾아보는 것 보다는 스스로 정리를 하면서 테스트도 해보니, 이해가 더 빠른 것 같다.
'iOS' 카테고리의 다른 글
Swift 싱클톤 패턴 (0) | 2020.11.10 |
---|---|
Swift Joined() (0) | 2020.10.19 |
Swift 구조체 vs 클래스 (0) | 2020.04.13 |
Swift 프로토콜 (0) | 2020.04.13 |
Swift 클로저 (0) | 2020.04.06 |