Automatic Reference Counting의 줄임말으로, Swift에서 이를 통해 앱의 메모리 사용량을 추적하고 관리합니다. 대부분 이 친구가 작동을 하여 메모리 관리에 대해 생각할 필요가 없습니다.
클래스 인스턴스가 더 이상 필요하지 않다면 ARC는 해당 인스턴스가 차지하는 메모리를 자동으로 해제합니다.
그러나 다른 상황에서 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
를 많이 사용하고 있는데 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