AutoRelease란 참조 카운트를 나중으로 미루기 위한, 그러면서도 카운트가 나중에 감소되는 것을 보장받기 위한 기법입니다.
autoRelease된 객체는 AutoReleasePool에 등록됩니다. AutoReleasePool은 객체를 관리하는 일종의 컬렉션입니다.
그리고 이 컬렉션이 해제될 때 관리하는 객체를 모두 release합니다.
즉 AutoReleasePool 안에서 생성된 객체는 AutoReleasePool 함수가 끝나는 시점에서 전부 해제가 된다는 것!
그럼 바로 코드로 확인해 봅시다!!
class AClass {
let name: String
init(name: String) {
self.name = name
}
}
weak var class01: AClass? = nil
weak var class02: AClass? = nil
class01 = AClass(name: "난 평범하게 태어났어요")
autoreleasepool {
class02 = AClass(name: "난 오토릴리즈풀에서 태어났어요")
}
print(class01?.name) // 난 평범하게 태어났어요
print(class02?.name) // nil
위 코드를 보시면 autoreleasepool 안에서 태어난 인스턴스는 자원해제가 되어 사라졌다는 걸 확인하실 수 있습니다.
메서드 안에서 생성된 객체들은 해당 메서드가 끝날 때 까지 살아있게 됩니다.
만약 하나의 메서드 안에서 메모리를 많이 잡아먹는 객체(이미지)들이 많이 생성되고
async/await 함수로서 오랫동안 실행될 경우가 있다면 많은 메모리를 오랫동안 점유할 수도 있습니다.
이런 경우 autoreleasepool을 이용하여 사용 끝난 객체들은 빨리빨리 자원해제하게 하여 메모리 관리에 도움을 줄 수 있습니다.
아래 이미지는 autoreleasepool을 사용하여 대략 어떤식으로 메모리 관리를 할 수 있을지 보여주고 있습니다.
더 자세한 내용은 참고자료 확인!
(적용 전)
(적용 후)