๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด
๊ฐ์ฒด๊ฐ ์์ ์ ์ฑ ์์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์(Delegate)ํ๋ ๋์์ธ ํจํด
๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋จ๋ฐฉํฅ์ผ๋ก ์ํตํ๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํ๋ค.
์์
import UIKit
protocol ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ {
func ํจ์A()
}
class ClassA {
var delegate: ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ?
func A์ํจ์() {
delegate?.ํจ์A()
}
}
class ClassB: ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ {
// ClassB๋ ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฑํํ๊ธฐ ๋๋ฌธ์ ํจ์A()๋ฅผ ๊ตฌํํด์ผํ๋ค.
func ํจ์A() {
print("ํจ์A๊ฐ ์คํ๋์์ต๋๋ค.")
}
}
let classA = ClassA()
let classB = ClassB()
classA.delegate = classB
classA.A์ํจ์() // ํจ์A๊ฐ ์คํ๋์์ต๋๋ค.
์์ ์ฝ๋์์ ClassA๋ ๋ด๋ถ์์ delegate๋ผ๋ ์์ฑ์ ๊ฐ๋๋ค.
delegate์ ํ์ ์ '๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ' ๋ผ๋ ํ๋กํ ์ฝ๋ก ์ง์ ๋์ด์๋ค.
ํ๋จ ๋ถ๋ถ์์ ClassA์ delegate๋ฅผ ClassB์ ์ธ์คํด์ค๋ฅผ ๋ด์ ๋ณ์๋ก ์ง์ ํ ๋ค์,
ClassA์ ํจ์๋ฅผ ์คํํ๋๋ ClassB์ ํจ์๊ฐ ์คํ๋์๋ค.
ClassA์์ ํจ์๋ฅผ ํธ์ถํ๋๋ ClassB์์ ํจ์๊ฐ ํธ์ถ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ์ด์ฉํด์ ๋ ๊ฐ์ฒด๊ฐ ์ํตํ ์ ์๋๋ก ๋ง๋ค์๋ค.
์ฑ์ ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ์ด๋ ๊ฒ ClassB์ ํจ์๋ฅผ ClassA์์ ์คํํด์ผํ ๊ฒฝ์ฐ๋ค์ด ์ข ์ข ์๋ค.
๋๋ ClassA์์ ํจ์๋ฅผ ์คํํ๋ฉด ClassB, ClassC, ClassD์ ํจ์๋ฅผ ์คํ์์ผ์ผ ํ ๊ฒฝ์ฐ๋ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ์ฌ์ฉํ์ฌ ์ ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์ฃผ์ํด์ผํ ๋ถ๋ถ
๋ ๊ฐ์ฒด๊ฐ ์๋ก ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์์ ๊ฒฝ์ฐ Strong Reference Cycle์ด ์๊ธธ ์ ์๋ค.
weak var delegate: SomeDelegate? ์ด๋ฐ์์ ์ ์ธ์ ํตํด ๊ฐํ์ฐธ์กฐ์ธ์ดํด ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ค.
๊ทผ๋ฐ ์ ์ฝ๋์์ weak var delegate: ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ? ์ด๋ ๊ฒ ์ ์ธํ๋ฉด ์๋์ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณผ ์ ์๋ค.
'weak' must not be applied to non-class-bound 'MyDelegate'; consider adding a protocol conformance that has a class bound
ํ๋กํ ์ฝ์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์ฌ์ฉํ ์ ์๋๋ฐ ์์์ ์ ์ธํ ํ๋กํ ์ฝ์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ์ด๋์ ์ฌ์ฉ๋๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ reference count ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ๋๋ unowned, weak ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด
protocol ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ: AnyObject {
func ํจ์A()
}
class ClassA {
weak var delegate: ๋ญ๊ฐ์ํค๋๋ธ๋ฆฌ๊ฒ์ดํธ?
func A์ํจ์() {
delegate?.ํจ์A()
}
}
AnyObject๋ฅผ ์ฑํํด์ฃผ๋ฉด ์ค๋ฅ๋ฅผ ํผํ ์ ์๋ค. (swift 4๋ฒ์ ๋ฏธ๋ง์ class๋ฅผ ์ฑํํด์ฃผ๋ฉด ๋๋ค.)
weak ํค์๋๋ ์ฐธ์กฐ ์ ํ์ ๋ํด์๋ง ์ ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ์ ํ์ธ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์์๋ ์ ์๋ ์ ์๋ ๊ฒ์ด๋ค.
'๐ iOS > ๋์์ธํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฝ๋๋ค์ดํฐ ํจํด (0) | 2023.05.07 |
---|---|
Clean Architecture (0) | 2023.04.28 |