[TIL] 11.19

rbw·2022년 11월 19일
0

TIL

목록 보기
49/98

ARC in Swift

ARC란?

Automatic Reference Counting의 줄임말으로, Swift에서 이를 통해 앱의 메모리 사용량을 추적하고 관리합니다. 대부분 이 친구가 작동을 하여 메모리 관리에 대해 생각할 필요가 없습니다.

클래스 인스턴스가 더 이상 필요하지 않다면 ARC는 해당 인스턴스가 차지하는 메모리를 자동으로 해제합니다.

그러나 다른 상황에서 ARC는 메모리를 관리하기 위해 코드의 다른 부분간 링크에 대한 추가 정보가 필요합니다.

Closure에서의 ARC

// imageView를 캡처하고 있으므로 참조가 유지가 되고 있음.
var imageView: UIImageView?
let request = URLRequest(url: URL(string: "https://blablabla")!)
URLSession.shared.dataTask(with: request) { data, response, error in
    imageView?.image = UIImage(data: data!)
}

// weak를 사용하여 참조를 유지하지 않음. 
var imageView: UIImageView?
let request = URLRequest(url: URL(string: "https://blablabla")!)
URLSession.shared.dataTask(with: request) { [weak imageView] data, response, error in
    imageView?.image = UIImage(data: data!)
}

Task 에서의 weak self

최근 프로젝트에서 Task를 많이 사용하고 있는데 ARC를 보면서 Task 도 강한 참조가 일어나서 문제가 되는게 아닐까 하고 알아보았다

알아보니, Task의 코드들은 대부분 weak self 를 사용하지 않고 있다. 이유로는 비동기 작업이 끝나면 알아서 참조를 해제한다고 한다. (똑똑하네~)

weak self를 사용하는 경우도 있기는 하다만, Task의 경우에는 nil, cancel등을 사용해서 참조를 해제하는 방식을 추천하였다.

var task: Task<Void, Never>?

func function2() {
    task = Task {
        let result = await apiClient.performNetworkRequestAsync()
        printSomething()
        task = nil
    }
}

참조

https://stackoverflow.com/questions/71728943/async-await-task-and-weak-self

profile
hi there 👋

0개의 댓글