Delegate 를 weak variable로 만드는 이유는 무엇인가요?

안녕하세요?
제목이 곧 내용인데요, 왜 delegate를 weak 한 variable로 만드는 것 인가요!

( 그리고 왜 프로토콜은 또 옵셔널로 있는 것인지 추가질문 드립니다 ^_^)

좋아요 1

객체는 ‘사용 중’ 이라는 표시가 되면 이를 카운트합니다. 이를 리테인 카운트라고 해요. 리테인 카운트가 0이면 '더 이상 사용하지 않는 객체’이므로 메모리에서 해제됩니다.

'사용 중’이라고 표시를 하면, '더이상 사용하지 않음’이라고 바꿔주는 책임이 있거든요. weak로 선언을 하면 '사용 중’이라는 표시를 하지 않고 사용한다고 보면 쉬울 거에요.

일단은 간단하게 여기까지만… 저녁 먹으러…(다른 분이 더 글을 달아주실 겁니다)

좋아요 1

감사합니다 맛저녁 하세요.
그런데 그렇다면 strong 으로 선언 하면 ‘사용 중’ 이라는 표시를 하고 사용하는 건가요?

좋아요 1

weak 표시를 안하면 strong 이 됩니다. strong은 객체에 사용 중이라는 표시를 하고 소유한다고 합니다.(ownership)

strong 으로만 객체를 사용(참조)하면 두 개 혹은 그 이상의 객체가 상호 소유하게 되면서(Strong Reference Cycles) 객체가 해제되지 않는 현상이 생길 수 있습니다. 메모리 누수가 생기게 됩니다.

strong, weak은 Swift 의 Automatic Reference Counting 부분을 더 찾아보시면 나옵니다.

좋아요 2

비슷한 질문인듯 다른듯해서… 애매하지만 남겨봅니다.

  1. ':class’를 뭐라고 이해해야 할까요? 타입(?) 또 다른 프로토콜?
  2. ':class’를 왜 지정해줬는지 궁금합니다.
  3. delegate 지정시에 self를 쓰던데, self를 쓸 수 있는건 (프로토콜에 타입이 존재한다면…)프로토콜의 타입이 단순히 클래스이기 때문인가요? 아니면 대리자로 뷰컨트롤러를 지정해야 하기 때문인가요?
  4. 프로토콜 델리게이트 패턴 특성상 1:n 관계 때문에 weak가 필수적이지 않을까 생각하는데, 이해한게 맞는지 모르겠습니다ㅠ

질문 폭탄이네요…

좋아요 2

':class’는 클래스만 이 프로토콜을 채택(adopt)하도록 하라는 의미로 사용되는데, 스위프트 4부터는 ':class’가 없어졌다고 하네요.

공식 문서에서는 ‘:class’ 에서 ‘:AnyObject’ 로 바꼈습니다.
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

좋아요 3

오왓 하나의 글에 되게 많은 질문이 해결되었네요!!! 감사해요:)

  1. 프로토콜이 채택하는 타입을 결정하는 것
  2. weak 키워드 사용(메모리 누수 때문)을 위해서, 하지만 이제 일반적인 방식이 아니기 때문에 Anyobject로 하는게 좋다!
  3. 결국 viewcontroller가 클래스이기 때문에 self로 지정이 가능했던 것 꼭 viewcontroller는 아니어도 된다는? 의미인 것 같습니다! 감사합니다~
좋아요 1

2번은

스위프트 문법 변경 사항으로, 프로토콜을 정의할 때 클래스 전용으로 선언하려면 class 를 붙였습니다. 그런데 class로 하는 방식은 deprecated되었고 AnyObject 를 사용해야죠.

weak는 class, AnyObject 와 별개로, 여기서는 클래스 프로퍼티를 선언하면서 객체 소유를 하지 않는 방식으로 참조하기 위해서 사용한 것입니다.

좋아요 2