Lined Notebook

Delegate란 무언인가 설명하고, retain 되는지 안되는지 그 이유를 함께 설명하시오.

by 사슴비행기

이 블로그가 설명을 잘 해둔것 같습니다.

 

Delegate? retain이 될까?

1주차 스터디에서 공부했던 "Delegate란 무엇인지 설명하고, Retain이 되는지 안되는지 그 이유를 함께 설명하시오"라는 주제 정리하기🤓Deletate은 "대리자, 위임하다"라는 단어의 뜻처럼 하나의 객

velog.io

 

제식대로 정리해보겠습니다.

 

Delegate

: 대리자, 위임자

: 하나의 객체에서 모든 일을 처리하지 않고 처리해야 할 일 중 일부를 다른 객체에 넘기는 것.

(위임된 책임을 캡슐화하는 프로토콜로 구현되며, 위임자가 위임된 기능을 제공하도록 보장한다 -- 무슨 말인지 약간 모르겠음 당연한거 아닌가..?)

: delegate를 통해 일을 위임한 객체는 일을 시킬 뿐, 일이 어떻게 처리되는지 모르기 때문에 코드의 유지보수 측면에서 장점.

 

retain

: 객체가 메모리에서 해제되지 않도록 호출되어 레퍼런스 카운트를 증가시킴.

: delegate는 객체끼리 참조값을 사용하기 때문에 retaine된다.

 

메모리 누수는 어떻게 발생하는가?

: Swift는 ARC를 활용해서 자동으로 앱의 메모리 사용을 추적하고 관리.

: 두 인스턴스가 서로 강하게 참조하고 있을 때 RC가 0이 아니기 때문에 참조해제가 불가능해서 메모리 누수가 일어남.

: 필요치 않은 메모리를 계속 점유하고 있어서 메모리 사용량이 증가.

 

메모리 누수를 방지하는 방법 중 weak과 unowned의 차이?

: RC를 증가시키지 않는다는 공통점이 있음.

 

weak

: 약한참조

: A와 B가 서로 참조

  A인스턴스가 더 수명이 짧아 먼저 할당해제할 수 있을 때 B가 A를 약하게 참조함.

: 참조하는 인스턴스가 메모리에서 해제되면 자동으로 weak 참조를 nil로 설정함.

==> 런타임에 nil로 변경될 수 있기 때문에 weak 참조 인스턴스는 항상 Optional과 var(변수)로 선언되어야 함.

 

unowned

: weak과 달리 unowned로 선언된 프로퍼티는 항상 값을 가질 것으로 예상 함.

==> NonOptional, let으로 선언 가능

: 메모리에 없는 값에 접근하려고 하면 crash가 발생

==> 다른 인스턴스와 수명이 같거나 더 길다고 확신할 수 있을 경우에만 사용해야 한다.

 

Delegate에 struct를 사용하면 될까?

: 구조체는 값 타임

==> 할당 포인터를 넘기받지 X

==> 값이 복사 O

: struct(구조체)를 사용할 경우, textField.delegate = self 와 같이 위임자를 넘겨받는 과정에서 주소값이 아니라 값을 넘겨주기 때문에 구조체를 delegate로 선언하는 것은 적절치 X

∴ 프로토콜을 클래스만 채택할 수 있도록 AnyObject를 채택하고 메모리 누수를 막기위해 delegate를 weak로 선언해준다.

블로그의 정보

Beautiful Coding

사슴비행기

활동하기