Swift: autoreleasePool

틀틀보·2025년 5월 12일

Swift

목록 보기
5/19

해당 도구로 선언된 코드 내에서 생성된 임시 객체를 관리하는 도구 + 참조 카운트가 감소되는 것을 미루어 나중에 감소되는 것을 보장

어디에 쓰는가?

  • 방대한 임시 객체가 생성되는 경우
  • 메모리 관리

사용 예시

autoreleasePool 사용 X

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 이라는 객체 수 만큼!

⚠️ 왜 for문을 벗어났는데도 객체가 메모리에서 해제되지 않았을까?

Objective-C 기반의 객체

  • Objectvie-C 런타임에 기반하는 API들은 Swift 기반과 다르게 동작.

  • 해당 객체들의 initautorelease 방식으로 반환하는 경우가 다수

  • autorelease의 사용으로 해당 객체가 스코프를 벗어나더라도 현 스레드의 Autorelase Pool에 등록하고 비워질 때 함께 해제

  • 그래서 for 문을 벗어나더라도 메모리에서 해제 X

autoreleasePool 사용

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개씩 관리되어 메모리에 부하를 줄일 수 있다.

이거 꼭 써야 할까요?

  • 참고한 블로그에서 시 객체들이 실제 앱에서 무자비하게 많을 일이 없음이라는 글. 동의 ✅
  • 캐싱을 통한 메모리 추가 사용 가능성 X

찾아본 내용

알아야 할 내용

Objective-C 기반의 API는 ARC와 autorelease 메커니즘이 함께 동작한다. EX) UIImage(contentsOfFile:)

기본적으로 메인 스레드에서는 autoreleasePool이 존재한다.

  • 런 루프가 각 이벤트 사이클마다 자동으로 autoreleasePool을 생성하고 비움

swift로 작성된 코드는 ARC로 메모리 관리 된다.

Objective-C 기반으로 작성된 코드들은 autoreleasePool로 관리가 필요하다.

  • 새롭게 생성된 스레드나 백그라운드 스레드는 autoreleasePool이 설정(자동 생성, 삭제 X)되어 있지 않으므로 Objc 기반의 API나 코드를 사용할 경우 autoreleasePool을 명시적으로 사용하여 관리가 필요함.
  • but ARC가 이것또한 Thread가 종료될 때, 객체들이 해제되면 Objc 코드 내부에 autorelease를 사용해 해제해줌.

참고
https://jeong9216.tistory.com/459

https://stackoverflow.com/questions/9086913/why-is-autoreleasepool-still-needed-with-arc

profile
안녕하세요! iOS 개발자입니다!

0개의 댓글