iOS

[iOS] 클로저에서 [weak self] 알아보기

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)
    }
})

 

[출처]

https://medium.com/@b9d9/swift-weak-self-%EB%A5%BC-%EC%99%9C-%EC%93%B0%EB%8A%94-%EA%B1%B8%EA%B9%8C-e803879b2e2d

[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