우선 Swift의 메모리 관리에 대해서 먼저 알아보자
-> 순서가 뒤죽박죽이긴 한데, 이후에 ARC에 대해서도 따로 적을 것이다.
Swift는 이전에 Object-C에서 파생된 언어이기 때문에, 메모리 관리를 비슷하게 따라가지만, 개발자에게 좀 더 편하게 바뀌었다.
MRC -> ARC 로 변화된 것이다.
이로써 개발자들은 일일히 객체들의 참조 카운트를 retain/release 할 필요가 없어졌다.
물론 ARC를 통해 모든 Dangling Pointer들이 처리되면 좋겠지만 아쉽게도 아니다. -> 이후에 적을 것...
알아보기로 한 autorelease를 알아보자.
AutoRelease란?
- 참조 카운트를 나중으로 미루기 위한, 카운트가 나중에 감소되는 것을 보장받는 기법
- 객체의 참조 카운트를 감소시킬 때, release 대신 autorelease를 사용하면 예약이 된다.
- 실제로 release를 수행하면 카운트가 바로 줄지만, autorelease는 직후에는 감소되지 않는다.
- autoRelease된 객체들은 autoReleasePool에 등록된다. -> 간단한게 쓰레드풀을 떠올리면 될 것 같다.
- 이 autoRelease이 해제될 때, 내부의 객체들이 모두 release된다!!
- 해당 autoreleasePool은 foundation Framework에 있다.
func useManyImages() {
let filename = pathForResourceInBundle
for _ in 0 ..< 5 {
for _ in 0 ..< 1000 {
let image = UIImage(contentsOfFile: filename)
}
}
}
이미지를 5천번 가져오는 반복문을 예로 들어보자.
메소드가 종료되기 전까지는 생성된 5000개의 image가 메모리 공간에 유지되며 함수가 종료될 때, 해당 image들을 가르키는 참조 카운트가 줄어들며 release된다.
-> 즉, 함수가 끝나기 전까지 5000개의 이미지가 메모리 안에 존재한다는 말!! -> 만약 iOS 폰 내에서 많은 메모리를 사용하고 있고, 메모리가 부족하다면 원치 않게 App이 죽는 경우가 생길 수도 있다.
이러한 상황을 막기 위해 AutoRelease를 사용한다.
func useManyImages() {
let filename = pathForResourceInBundle
for _ in 0 ..< 5 {
autoreleasepool {
for _ in 0 ..< 1000 {
let image = UIImage(contentsOfFile: filename)
}
}
}
}
똑같이 이미지를 5천번 가져오는 반복문이다.
이미지 1천번을 가져오는 for문을 autoRelease로 감싸고 해당 블럭을 5회 진행한다.
->
이미지 1000개를 메모리에 올리고, autoReleasePool이 비워지면서 해당 1000개가 메모리에서 내려가고
이미지 1000개를 메모리에 올리고, autoReleasePool이 비워지면서 해당 1000개가 메모리에서 내려가고
이미지 1000개를 메모리에 올리고, autoReleasePool이 비워지면서 해당 1000개가 메모리에서 내려가고
이미지 1000개를 메모리에 올리고, autoReleasePool이 비워지면서 해당 1000개가 메모리에서 내려가고
이미지 1000개를 메모리에 올리고, autoReleasePool이 비워지면서 해당 1000개가 메모리에서 내려가고
방식으로 작동할 것으로 예상된다.
메모리 사용량 그래프를 보면 쉽게 이해할 수 있다.
사용하지 않았을 때, 순간 메모리 사용량이 43MB을 사용했지만, 사용했을 때는, 순간 최고 사용량이 14MB로 현저히 낮은 것을 볼 수 있다.
물론 실제 코드에 사용된다면 내에서 해당 이미지들을 사용하고, 유지하기 위해 다른 참조카운트를 증가시키면 결과는 달라질 수 있지만
우선은 AutoReleasePool의 역할을 알아보았다.
참조 : stackoverflow.com/questions/25860942/is-it-necessary-to-use-autoreleasepool-in-a-swift-program
'Swift' 카테고리의 다른 글
[Swift] 구조체/클래스 - 스위프트 언어 및 문법(5) - feat.야곰's Swift Programming (0) | 2021.01.14 |
---|---|
[Swift] 옵셔널 - 스위프트 언어 및 문법(4) - feat.야곰's Swift Programming (0) | 2021.01.14 |
[Swift] 함수/메서드 - 스위프트 언어 및 문법(3) - feat.야곰's Swift Programming (0) | 2021.01.14 |
[Swift] 데이터타입 - 스위프트 언어 및 문법(2) - feat.야곰's Swift Programming (0) | 2021.01.14 |
[Swift] 스위프트란? - 스위프트 언어 및 문법(1) - feat.야곰's Swift Programming (0) | 2021.01.14 |