develop

autoreleasepool 본문

iOS

autoreleasepool

pikachu987 2021. 1. 25. 20:25
반응형

반복적으로 메모리를 많이 차지하는 로직을 사용할때 메모리가 해제되지 않고 앱이 죽어버리는 경우가 있다.

메모리를 해제할 시간을 주지않고 계속 메모리를 사용을 해서 생기는 문제이다.

메모리가 한계까지 올라가면서 앱이 죽는다.

이런 경우에 autoreleasepool을 사용하게 되면 특정 로직을 실행하기 전에 임시오토릴리즈풀이 만들어지고 블럭을 빠져나간 뒤에 임시오토릴리즈풀은 비워지게 되면서 메모리 사용량이 다시 줄어들게 된다.

오토릴리즈풀 함수 안에서 만약 i가 10보다 클 때 for문을 나가려면 어떻게 해야할까?

 

오토릴리즈풀 블럭 안에서는 return이 되지 않는다. break 는 컴파일에러가 난다.

 

autoreleasepool 함수 안에서 리턴값으로 Result를 받는다.

autoreleasepool 함수는 Result를 리턴해준다.

func autoRelease() {
        let imagePath = "https://images.pexels.com/photos/104827/cat-pet-animal-domestic-104827.jpeg"
        guard let url = URL(string: imagePath) else { return }
        DispatchQueue.global().async {
            for i in 0...10000 {
                let result = autoreleasepool { () -> Result<Void, Error> in
                    if let data = try? Data(contentsOf: url) {
                        let image = UIImage(data: data)
                        print("\(i)번째: \(String(describing: image))")
                        if i > 10 {
                            return .success(())
                        }
                    }
                    return .failure(NSError(domain: "", code: 0, userInfo: nil) as Error)
                }
                if case .success(_) = result {
                    break
                }
            }
            print("종료")
        }
    }

이렇게 특정 조건이 되면 Result를 리턴해주면 된다.

그리고 포문 안에서는 Result에 따라 원하는 로직으로 만들면 된다.

반응형

'iOS' 카테고리의 다른 글

Class Struct == Operator  (0) 2021.01.27
Struct initialization  (0) 2021.01.26
BackgroundFetch 앱 백그라운드 상태에서 로직 실행하기  (0) 2021.01.24
Cache 앱의 캐시 사용하기  (0) 2021.01.23
Generic  (0) 2021.01.21
Comments