728x90
capture와 escaping
- capture: 클로저 내부에서 밖에 있는 scope의 instance를 참조하는 것
- escaping: 클로저 외부에서 해당 클로저 자체를 참조하고 있는 것
Escaping closure
: 함수의 인자로 전달된 클로저가 함수가 반환된 후 실행 되는 클로저
// 함수의 return보다 completion이 늦게 실행되는 경우 (escaping closure)
func someFunction(completion: @escpaing () -> Void = {}) {
self.someDelayProcess {
completion()
}
print("someFunc!")
return
}
Weak reference(약한 참조)
: Retain Cycle(순환 참조)로 인한 메모리 릭을 벗어나기 위해 사용
- escaping closure 안에서 지연할당의 가능성이 있는 경우 (ex API 비동기 데이터 처리, 타이머 등)
- 일반 클로저에서는 weak self를 사용할 필요가 없다.(ex map, sort)
[weak self] 예시
- DispatchQueue
DispatchQueue.main.async { [weak self] in
self?.view.backgroundColor = .red
}
- AlertAction
// ✨ Weak reference(약한 참조) 사용 -> Retain Cycle(순환 참조)로 인한 메모리 릭을 벗어나기 위해 사용
let registerButton = UIAlertAction(title: "등록", style: .default, handler: { [weak self] _ in
guard let title = alert.textFields?[0].text else { return }
let task = Task(title: title, done: false)
self?.tasks.append(task)
self?.tableView.reloadData()
})
- Timer
// 타이머 실행중 이벤트
self.timer?.setEventHandler(handler: { [weak self] in
guard let self = self else {return}
self.currentSeconds -= 1
let hour = self.currentSeconds / 3600
let minute = (self.currentSeconds % 3600) / 60
let second = (self.currentSeconds % 3600) % 60
self.timerLabel.text = String(format: "%02d:%02d:%02d", hour, minute, second)
self.progressView.progress = Float(self.currentSeconds) / Float(self.duration)
UIView.animate(withDuration: 0.5, delay: 0, animations: {
self.imageView?.transform = CGAffineTransform(rotationAngle: .pi)
})
UIView.animate(withDuration: 0.5, delay: 0, animations: {
self.imageView?.transform = CGAffineTransform(rotationAngle: .pi * 2)
})
if self.currentSeconds <= 0{
// 타이머가 종료
self.stopTimer()
AudioServicesPlaySystemSound(1005)
}
})
[출처]
[Swift] 클로저에서의 weak self 에 대해 알아보자
[iOS - swift] weak self 알고쓰기 (escaping closure, memory leak, weak self를 사용해도 crash가 나는 이유)
728x90
'iOS' 카테고리의 다른 글
[iOS] STT 구현하기(feat. Speech 프레임워크) (2) | 2024.03.03 |
---|---|
[iOS] iOS 캡쳐 방지 기술 (3) | 2022.11.01 |
[iOS] APN, FCM 정리 (0) | 2022.07.25 |
[iOS] UIStackView 정리 (0) | 2022.07.12 |
[iOS] Xcode error 대처 방법 (0) | 2022.06.06 |