해당 도구로 선언된 코드 내에서 생성된 임시 객체를 관리하는 도구 + 참조 카운트가 감소되는 것을 미루어 나중에 감소되는 것을 보장
func processImages() {
let imagePath = Bundle.main.path(forResource: "largeImage", ofType: "png")!
for _ in 0..<10 {
for _ in 0..<1000 {
let image = UIImage(contentsOfFile: imagePath)
// 이미지 처리 로직
...
}
}
}
예상을 해보자면 ARC가 각각의 UIImage 객체들이 함수가 끝나기 전까지는 reference Count가 1이라서 메모리에서 해제되지 않아 계속해서 점유하고 있을 것이다. 무려 1000 * 10 이라는 객체 수 만큼!
Objectvie-C 런타임에 기반하는 API들은 Swift 기반과 다르게 동작.
해당 객체들의 init은 autorelease 방식으로 반환하는 경우가 다수
autorelease의 사용으로 해당 객체가 스코프를 벗어나더라도 현 스레드의 Autorelase Pool에 등록하고 비워질 때 함께 해제
그래서 for 문을 벗어나더라도 메모리에서 해제 X
func processImages() {
let imagePath = Bundle.main.path(forResource: "largeImage", ofType: "png")!
for _ in 0..<10 {
autoreleasepool {
for _ in 0..<1000 {
let image = UIImage(contentsOfFile: imagePath)
// 이미지 처리 로직
...
}
}
}
}
이제 autoreleasePool 내부에서 객체가 관리되기 때문에 1000개의 UIImage 객체에 대한 처리가 종료되면 해당 객체들은 모두 reference Count가 0이 되므로 메모리에서 해제되어 기존 1000, 2000, 3000, ... 개씩 관리되던게 1000개씩 관리되어 메모리에 부하를 줄일 수 있다.
참고
https://jeong9216.tistory.com/459
https://stackoverflow.com/questions/9086913/why-is-autoreleasepool-still-needed-with-arc