์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ Swift ] weak self๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ๊ธฐ๋Š” ์“ฐ๋Š”๋ฐ ์ •ํ™•ํ•˜๊ฒŒ ์–ธ์ œ, ์–ด๋–จ ๋•Œ ์“ฐ๋Š”๊ฑฐ์ง€?

๋ณธ๋ฌธ

์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋ฉด์„œ ๊ทธ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋˜

[ weak self ]์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค. 

 

 

 

1. weak self๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 


๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. 

Swfit์˜ ARC๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค. 

 

ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ, ARC๋Š” ์ด ์ฐธ์กฐ๋ฅผ ๋Š์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

 

2. ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ค ์ƒํ™ฉ์„ ๋งํ•˜๋Š”๊ฑฐ์ง€? 


๊ฐ์ฒด๋“ค์ด ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์€, ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•˜๋ฉด์„œ

๊ทธ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ฒด๋˜์ง€ ์•Š๋„๋ก ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. 

 

Swfit์˜ ARC๋Š” ๊ฐ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ถ”์ฒ™ํ•˜๋ฉฐ, 

์ด ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

1) ๋‹จ์ˆœ ์ฐธ์กฐ

๊ฐ์ฒดA๊ฐ€ ๊ฐ์ฒดB๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์€ ๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒดB๋ฅผ ์†Œ์œ ํ•˜๋ฉด์„œ

๊ฐ์ฒด B๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒดB๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค. 

 

* Swfit์—์„œ ARC๊ฐ€ ๊ฐ•ํ•œ์ฐธ์กฐ๊ฐ€ ๊ธฐ๋ณธ์ธ ์ด์œ 

๊ฐ์ฒด์˜ ์ˆ˜๋ช…๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

๊ฐ์ฒด๊ฐ€ ์†Œ์œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ๋•Œ ๊ทธ ์†Œ์œ ์ž๊ฐ€ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ๋ช…ํ™•ํžˆ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•˜๊ณ  ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

 

class A {
    var objectB: B?
}

class B {
    var name: String
    init(name: String) {
        self.name = name
    }
}

let objectA = A()
let objectB = B(name: "Object B")

objectA.objectB = objectB  // A๊ฐ€ B๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•จ

 

๊ฐ์ฒด objectB๋Š” objectA์˜ ์†์„ฑ objectB์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค

ARC๋Š” objectA๊ฐ€ objectB๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํ•œ objectB๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

2. ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด

๋ฌธ์ œ๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. 

์ด๋•Œ ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์ด ์ƒ๊ฒจ ARC๊ฐ€ ์ด ์ฐธ์กฐ๋ฅผ ๋Š์ง€ ๋ชปํ•˜๊ณ , ๋‘ ๊ฐ์ฒด ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ!

class A {
    var objectB: B?
}

class B {
    var objectA: A?
}

let objectA = A()
let objectB = B()

objectA.objectB = objectB  // A๊ฐ€ B๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐ
objectB.objectA = objectA  // B๊ฐ€ A๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐ

 

์—ฌ๊ธฐ์„œ ๊ฐ์ฒด A๋Š” ๊ฐ์ฒด B๋ฅผ, ๊ฐ์ฒด B๋Š” ๊ฐ์ฒด A๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•œ๋‹ค.

์ด์ œ ๋‘ ๊ฐ์ฒด๋Š” ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ARC๊ฐ€ ์ด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

 

3. ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•?


๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋“ค ์‚ฌ์ด์˜ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ

์•ฝํ•œ ์ฐธ์กฐ(weak self) ๋˜๋Š” ๋ฏธ์†Œ์œ  ์ฐธ์กฐ(unowned reference)๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค. 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ARC๊ฐ€ ๊ฐ์ฒด ๊ฐ„์˜ ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

4. weak์™€ unknowned ์ฐธ์กฐ


  • weak ์ฐธ์กฐ
    :
    ํ•ญ์ƒ ์˜ต์…”๋„๋กœ ์„ ์–ธ๋˜๋ฉฐ, nil ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ. 
    ์ฐธ์กฐ๋œ ๊ฐ์ฒด๊ฐ€ ํ•ด์ œ๋˜๋ฉด ์ž๋™์œผ๋กœ nil์ด ํ• ๋‹น ๋œ๋‹ค. 
  • unowned ์ฐธ์กฐ
    ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์žˆ์„ ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒฝ์šฐ์—์„œ ์‚ฌ์šฉ. nil์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ. 

 

 

5. weak self๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ


weak self๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ํด๋กœ์ €๊ฐ€ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…๋ณด๋‹ค ์งง์„ ๋•Œ์ด๋‹ค. 

ํด๋กœ์ €๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚˜๋ฉด ๋ฐ”๋กœ ํ•ด์ œ๋˜๊ฑฐ๋‚˜, ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ์ฒด ์ˆ˜๋ช…์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ. 

 

์˜ˆ์‹œ)

- ๋น„๋™๊ธฐ ์ž‘์—…์ด ์—†๊ฑฐ๋‚˜, ๊ฐ์ฒด๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œ๋˜๋Š” ์ƒํ™ฉ

- ๊ฐ’ ํƒ€์ž…(struct, enum)์€ ์ฐธ์กฐ ์‚ฌ์ดํด์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— weak ์ฐธ์กฐ๊ฐ€ ํ•„์š” ์—†๋‹ค. 

 

 

 

6. weak์™€ weak self๋Š” ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€?


weak์€ ์ฃผ๋กœ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. 

์˜ˆ๋ฅผ๋“ค๋ฉด, delegate ํ”„๋กœํผํ‹ฐ๋Š” ๋Œ€๊ฒŒ weak์œผ๋กœ ์„ ์–ธ๋œ๋‹ค. 

 

weak self๋Š” ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ self๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” self๊ฐ€ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์ ์šฉํ•œ๋‹ค. 

ํŠนํžˆ ํด๋กœ์ €๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๊ณ„์—†์ด ์˜ค๋ž˜ ์ง€์†๋  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

ํด๋กœ์ €์˜ ์บก์ณ ๊ฐœ๋…์„ ํ•จ๊ป˜ ๊ณต๋ถ€ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. 

https://dkswlgus0314.tistory.com/351

 

 

 

* ARC(Automatic Refefence Counting)


Swift๋Š” ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ…(ARC)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

ARC๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋” ์ด์ƒ ํ•„์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ๋Œ€๋ถ€๋ถ„ ์ž๋™์œผ๋กœ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ํ•ด์ œํ•œ๋‹ค. 

 

์ฐธ์กฐ ์นด์šดํŒ…์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋งŒ ์ ์šฉ๋œ๋‹ค.

๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜•์€ ์ฐธ์กฐ ํƒ€์ž…์ด ์•„๋‹ˆ๊ณ  ๊ฐ’ ํƒ€์ž…์ด๋ฏ€๋กœ ์ฐธ์กฐ๋กœ ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

 

 

๐Ÿ”— Reference
https://bbiguduk.gitbook.io/swift/language-guide-1/automatic-reference-counting

 

 

 

 

 

 

 

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ