안녕하세요?
제목이 곧 내용인데요, 왜 delegate를 weak 한 variable로 만드는 것 인가요!
( 그리고 왜 프로토콜은 또 옵셔널로 있는 것인지 추가질문 드립니다 ^_^)
안녕하세요?
제목이 곧 내용인데요, 왜 delegate를 weak 한 variable로 만드는 것 인가요!
( 그리고 왜 프로토콜은 또 옵셔널로 있는 것인지 추가질문 드립니다 ^_^)
객체는 ‘사용 중’ 이라는 표시가 되면 이를 카운트합니다. 이를 리테인 카운트라고 해요. 리테인 카운트가 0이면 '더 이상 사용하지 않는 객체’이므로 메모리에서 해제됩니다.
'사용 중’이라고 표시를 하면, '더이상 사용하지 않음’이라고 바꿔주는 책임이 있거든요. weak로 선언을 하면 '사용 중’이라는 표시를 하지 않고 사용한다고 보면 쉬울 거에요.
일단은 간단하게 여기까지만… 저녁 먹으러…(다른 분이 더 글을 달아주실 겁니다)
감사합니다 맛저녁 하세요.
그런데 그렇다면 strong 으로 선언 하면 ‘사용 중’ 이라는 표시를 하고 사용하는 건가요?
weak 표시를 안하면 strong 이 됩니다. strong은 객체에 사용 중이라는 표시를 하고 소유한다고 합니다.(ownership)
strong 으로만 객체를 사용(참조)하면 두 개 혹은 그 이상의 객체가 상호 소유하게 되면서(Strong Reference Cycles) 객체가 해제되지 않는 현상이 생길 수 있습니다. 메모리 누수가 생기게 됩니다.
strong, weak은 Swift 의 Automatic Reference Counting 부분을 더 찾아보시면 나옵니다.
비슷한 질문인듯 다른듯해서… 애매하지만 남겨봅니다.
질문 폭탄이네요…
':class’는 클래스만 이 프로토콜을 채택(adopt)하도록 하라는 의미로 사용되는데, 스위프트 4부터는 ':class’가 없어졌다고 하네요.
공식 문서에서는 ‘:class’ 에서 ‘:AnyObject’ 로 바꼈습니다.
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
오왓 하나의 글에 되게 많은 질문이 해결되었네요!!! 감사해요:)
2번은
스위프트 문법 변경 사항으로, 프로토콜을 정의할 때 클래스 전용으로 선언하려면 class 를 붙였습니다. 그런데 class로 하는 방식은 deprecated되었고 AnyObject 를 사용해야죠.
weak는 class, AnyObject 와 별개로, 여기서는 클래스 프로퍼티를 선언하면서 객체 소유를 하지 않는 방식으로 참조하기 위해서 사용한 것입니다.