[Swift] autoreleasepool 언제 쓰면 좋을까?

OQ·2022년 7월 30일
0

Swift

목록 보기
9/11
post-thumbnail

참고자료

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을 사용하여 대략 어떤식으로 메모리 관리를 할 수 있을지 보여주고 있습니다.
더 자세한 내용은 참고자료 확인!

(적용 전)

(적용 후)

profile
덕업일치 iOS 개발자

0개의 댓글