ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Delegate Pattern
    iOS 2021. 12. 14. 22:57

    안녕하세요.

     

    이번에는 Delegate Pattern에 대해서 알아보도록 하겠습니다.

     

    Delegate는 대리자라는 뜻을 가지고 있는데요.

     

    Swift에서는 말 그대로 인스턴스가 해야할 일의 일부를 다른 인스턴스에 넘겨주는 디자인 패턴을 의미합니다.


    프로토콜(Protocol)

     

    Delegate를 이해하기 위해서는 프로토콜에 대한 이해가 필요한데요.

     

    프로토콜은 어떠한 역할을 하기 위한 프로퍼티, 메서드등의 청사진입니다.

     

    다른 언어에서의 인터페이스와 비슷하다고 보시면 될 것 같아요(절대 같지는 않습니다).

     

    Swift에서는 아래와 같이 작성합니다.

    특징은 기능을 구현하지는 않는다는 점입니다. 

     

    클래스, 구조체, 열거형에 프로토콜을 채택해서 프로토콜을 준수하도록 구현해야합니다.

     채택한 프로토콜의 요구사항을 모두 구현해야 합니다. 


    Delegate Pattern

     

    Delegate Pattern은 크게 3가지 요소로 구분할 수 있습니다.

     

    1. 델리게이트를 필요로 하는 인스턴스

     

    2. 델리게이트 요구사항을 정의한 프로토콜

     

    3. 델리게이트로서 동작하는 인스턴스

     

    말로만 보면 잘 이해가 가지 않으니 구체적인 예시를 보면 확인해보겠습니다. 

     

    UICollectionView를 통해서 설명하겠습니다. 

     

    UICollectionView가 어떻게 구성되어 있는지 살펴보면 delegate라는 프로퍼티를 가지고 있는 것을 확인할 수 있습니다 .

     

    이 UICollectionView가 1. 델리게이트를 필요로 하는 인스턴스 입니다.

     

    delegate의 타입인 UICollectionViewDelegate를 확인하면 protocol인 것을 확인할 수 있습니다.

    UICollectionViewDelegate가 2.델리게이트 요구사항을 정의한 프로토콜 입니다.

     

    그럼 3번은 무엇일까요.

     

    CollectionView를 소유하고 있는 ViewController가 될 수 있겠네요.

    ViewController가 3. 델리게이트로서 동작하는 인스턴스 입니다.

    ViewController에 UICollectionViewDelegate를 채택해주어야 collectionview의 델리게이트가 될 수 있습니다.

    UICollectionViewDelegate의 메소드는 모두 Optional이라 꼭 구현해야 하는 기능은 없습니다.

     

    Delegate 패턴을 사용하면 굉장히 유연하게 코드를 작성할 수 있는 장점이 있습니다.

    예를 들어, UICollectionView의 아이템이 선택되었을 때 동작하는 메소드입니다.

    이 함수가 어떤 기능을 할 지는 인스턴스마다 달라질 수 있는 것이죠. 

     

    이러한 delegate는 custom으로도 만들어서 사용할 수 있지만 주의할 점이 존재합니다.

    UICollectionView를 다시 한 번 살펴보겠습니다.

    weak로 선언된 것을 확인할 수 있습니다.

     

    이는 delegate가 retain되어 메모리 누수가 발생할 수 있기 때문입니다.

    만약 위와 같은 코드가 있을 경우 순환참조가 발생합니다.

     

    Swift는 ARC(Automatic Reference Counting)가 메모리를 자동으로 해제해줍니다. 

    ARC가 메모리를 해제해주는 시점은 해당 인스턴스의 참조 카운트가 0이 됐을 때 입니다.

     

    하지만 순환참조가 발생하게 되면 서로가 참조카운트를 1씩 증가시키게 되어 메모리에서 해제되지 않는 현상이 발생합니다.

     

    이러한 문제를 해결하기 위해서 위에처럼 weak로 선언해주거나 unowned로 선언해서 참조 카운트를 증가시키지 않아야 합니다.

     

    ARC 관련해서 공부할 기회는 앞으로 많을 것 같으니 그 때 다루도록 하겠습니다. 

     

    그럼, 오늘은 여기까지 하겠습니다.

    'iOS' 카테고리의 다른 글

    ARC(Automatic Reference Counting)  (0) 2021.12.20
    ViewController Life Cycle  (0) 2021.12.16
    View  (0) 2021.12.15
    iOS 개발하는데 실제 디바이스가 필요할까?  (0) 2021.12.14
    Frame & Bounds  (0) 2021.12.14
Designed by Tistory.