TIL(Today I Learned)

Delegate pattern?
  • iOS 개발에서 자주 사용되는 디자인 패턴으로 ‘위임하다’라는 뜻을 가진 Delegate를 갖고 있는 객체가 다른 객체에게 자신의 일을 위임하는 형태의 디자인 패턴
  • 객체가 자신의 책임을 다른 객체에게 위임하는 디자인 패턴
사용법
  1. protocol: 대리자가 수신자에게 전달할 내용의 규칙
  2. 수신자: 대리자가 특정 기능을 수행 후 전달받을 대상
  3. 대리자: 수신자를 대신하여 처리할 대리자
UI요소에서의 Delegate Pattern
  • ViewController에 tableView.delegate = self 와 같은 코드를 작성해 ViewController의 인스턴스 자신을 위임자(delegate)로 설정하고, didSelectRowAt 메소들에 셀을 탭했을 때의 행동을 정의
  • Why? -> 우리는 UITableView의 내부 코드를 수정할 수 x
    • 애플이 숨겨놓은 테이블뷰 안의 코드를 수정할 수 없기 때문에 가른 객체에서 해당 코드를 작성해준 뒤, 테이블뷰가 그 객체의 코드를 호출
  • 주로 delegating 객체는 이벤트를 받고 처리하는 responder 객체
실제 적용 예시
  • 두 뷰컨트롤러간의 데이터 전달
    • 사용자 입력 등의 이벤트를 받은 뷰컨트롤러와 그 결과를 처리해줘야하는 뷰 컨트롤러가 서로 다른 경우(ex. 사용자가 화면의 정보를 수정하고 이전 화면으로 돌아갔을 때 수정된 정보를 이전 화면으로 전달해야 하는 경우)
주의점! Strong Reference Cycle
  • delegating 객체는 delegate 프로퍼티를 통해 상대 객체를 강하게 참조하고 있고, delegate 객체 역시 delegating 객체를 강하게 참조하는 경우 String Reference Cycle 발생
  • 두개의 뷰컨트롤러 사이에 데이터 전달을 위해 델리게이트 패턴 사용 -> delegating 객체는 delegate 프로퍼티를 통해 상대 객체를 참조하고 있고, delegate 객체도 프로퍼티를 통해 delegating 객체를 참조하고 있어서 서로를 강하게 참조 -> 하나의 뷰컨트롤러가 사라진다고 해도 메모리에서 해제되지 않아 메모리 누수 발생

댓글남기기