
Swift์์ struct์ ๊ฐ์ ๊ฐ ํ์ ์ด ์๋๋ผ, class์ ๊ฐ์ ์ฐธ์กฐ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ฐธ์กฐ ์นด์ดํธ, Reference Count๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ ํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฑฐ๋, ์ฐธ์กฐํ ๋ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค๊ณ ์ฌ์ฉ์ ์๋ฃํ๋ฉด ๊ฐ์์ํต๋๋ค.
Objective -C์์๋ ์ด๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํ์๊ณ , ๊ทธ๊ฒ์ MRC Manual Reference Counting ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ Swift์์๋ ์ง์ ์ ์ผ๋ก ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฝ์ ํ๊ณ ํด์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ํ์ ์์ต๋๋ค. complier๊ฐ ์ปดํ์ผ ํ์์ ์๋์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์์ ํตํด ์์์ ๊ด๋ จ ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๋๋ฐ ์ด๋ฅผ ARC Automatic Reference Counting์ด๋ผ๊ณ ํฉ๋๋ค.

๊ทธ๋ ๋ค๋ฉด ์ ๋ง ์ด ์๋์ด๋ผ๋ ๋ง์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋๋. ์๋๋๋ค. ์๋ก๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค๋ฉด ๊ฐ๊ฐ์ ๋ณ์์์๋ ํ ๋น์ ํด์ ํ์์๋ ์๋ก ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฌ๋ฆฌ๊ณ ์์ด ๋ฉ๋ชจ๋ฆฌ์์ ๋ด๋ ค๊ฐ์ง ์๊ณ ๋จ์์๊ฒ ๋ฉ๋๋ค.

๋๋ฌธ์ ์ ํฌ๋ ์ด ๊ฐ์ฒด์ ์๋ช ์ด ๋๋ฌ๋์ง๋ฅผ ๊ด์ฐฐํ๊ธฐ ์ํด ๊ด์ฐฐ๋ ๊ฐ์ฒด ์๋ช (Observed Objectโs lifetime)์ ์ฌ์ฉํ๊ณ ๋ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ Weak, Unowned, Deinit๊ณผ ๊ฐ์ ํค์๋๋ค์ด ์๋๋ฐ ํนํ Weak์ Unowned๋ฅผ ์ฌ์ฉํ๋ฉด ์นด์ดํธ๋ฅผ ์ฌ๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ ์ํ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
weak & unowned

๋ค๋ง ์ด๋ค์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฌ๋ฆฌ์ง ์์์ Weak๋ Unowned๊ฐ ์ฌ์ฉ๋๋ ๋์ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ํ ๋น์ด ์ทจ์๋ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด Swift Runtime์ weak์ ๋ํ access๋ฅผ nil๋ก, unowned์ ๋ํ access๋ฅผ trap์ผ๋ก ์ ํํฉ๋๋ค.
์ ์ด๋ฐ ์ฐจ์ด๊ฐ ์์๊น์?

์ ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋๋ถํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค. weak๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํฌ์ธํฐ๋ unowned์ฒ๋ผ ์ ์ฅ๋์ด ์๋ HeapObject๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ์๋๋ผ object Pointer๋ฅผ ์ง๋๊ณ ์๋ SideTable์ด๋ผ๋ ๊ฒ์ด ์์ฑ๋๋ฉด์ HeapObjectSideTableEntry๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.

Side Table์ weak ํค์๋๋ฅผ ์ฌ์ฉํ์์ ๋, Strong๊ณผ unowned์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์ค๋ฒํ๋ก์ฐ ๋์์ ๋, ๊ฐ์ฒด๊ฐ ๊ด๋ จํ์ฌ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ด ํ์ํ ๋ ์๊ธฐ๋ ๊ฒ์ผ๋ก ์ค๋ ๋ ๊ฐ์ Race Condition์ ๋ง๊ธฐ ์ํด one-way Operation์ผ๋ก ์์ฑ๋ฉ๋๋ค.

๋๋ฌธ์ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ํ ๋น์ด ์ทจ์๋์ด Deinited ์ํ๊ฐ ๋๋๋ผ๋ side table์ด ๋จ์์๊ธฐ ๋๋ฌธ์ nil์ ๋ฐํ๋ฐ์ ์ ์๋ ๊ฒ๋๋ค. ๋ค๋ง ์ด๋ ๊ฒ ๋ฐ๋๋ค๊ณ ๊ฐ์ ๋ค์ ์ฌ์ฉํ๊ฑฐ๋ ํ ์๋ ์์ต๋๋ค. side table์ ์ด๋๊น์ง๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ผ ๋ฟ์ด๊ธฐ์ ํ์ ์ด ์๋ ๊ฒ์ผ ๋ฟ, ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.

๋ค๋ง ์ด๋ฌํ ๊ด์ฐฐ๋ ๊ฐ์ฒด ์๋ช ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ ๋งํ๋ฏ ๊ฐ์ฒด ์๋ช ์ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฝค๋ ์ํํ ์ ์์ต๋๋ค.

ARC WWDC์ ์์ ์์ ๋ณด๋ฉด test ํจ์์ ๋ง์ง๋ง์ account.printSummary()๊ฐ ์คํ๋ ์ ์์ง๋ง, ์ด๋ ์ฐ์ฐํ ์ผ์ผ ๋ฟ์ ๋๋ค. traveler ๊ฐ์ฒด์ ๋ง์ง๋ง ์ฌ์ฉ์ด ํด๋น ํจ์ ์ด์ ์ด๋ผ, ๊ฐ์ฒด ์๋ช ์ด ๋๋ฌ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋๋ก ์๋ํ๋ค๋ฉด, ์ด๋ nil๋ก ๋ณ๊ฒฝ๋์ด crash๊ฐ ๋ ๊ฒ์ ๋๋ค.
Solution
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. withExtendedLifetime()

withExtendedLifetime()์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ์๋ช ์ ๋ช ์์ ์ผ๋ก ์ฐ์ฅํ ์ ์์ต๋๋ค. ์ฐ์ฅํ๊ณ ์ถ์ ์ฝ๋๋ฅผ ํด๋ก์ ์ ๋ฃ๊ฑฐ๋, ํน์ ์ฐ์ฅํ๊ณ ์ถ์ ๋ผ์ธ ๋ฐ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. defer๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํจ์๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ฐ์ฒด ์๋ช ์ ์ฐ์ฅ์ํค๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด๊ฒ ์ฃ .
์ด๋ ๋ง์น MRC์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฐ์์๊ฒ ์ฑ ์์ด ์๊ตฌ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋ฌธ์ ๊ด์ฐฐ๋ ๊ฐ์ฒด ์๋ช ์ผ๋ก ๋ฒ๊ทธ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์์ ๋๋ง๋ค ์ฌ์ฉํ ์ ์๋๋ก ํด์ผํ ๊ฒ์ ๋๋ค. ์์นซํ๋ค๊ฐ ์ ์ง๊ด๋ฆฌ ๋น์ฉ์ด ์ฆ๊ฐํ๊ฒ ๋ ์ ์์ต๋๋ค.
2. ๋ ๋์ API๋ก ์ฌ์ค๊ณ

ํน์ ์ ์ด๋ถํฐ ๋ฒ๊ทธ๊ฐ ์ผ์ด๋์ง ์๋๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
3. ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ

ARC WWDC์์๋ ์ ์ด๋ถํฐ weak๋ unowned ํค์๋๋ฅผ ์ฌ์ฉํ๋ ์ผ ์์ด class ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๊ฒ์ด ์์์ง๋ ๋ชจ๋ฅด๋ ๋ฒ๊ทธ๋ค์ ์ ๊ฑฐํ๋ ํ์คํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ฌผ๋ก ์ฌ์ฉํด์ผํ๋ ์๊ฐ๋ค์ด ์์ผ๋ ๋ง๋ค์ด์ก์ ํ ๋ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์!๋ ์๋ ๊ฒ ๊ฐ๊ตฌ์. ์ด๋ฌํ ์ฌํญ๋ค์ ์ ์๊ฐํ๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
https://developer.apple.com/videos/play/wwdc2021/10216/
ARC in Swift: Basics and beyond - WWDC21 - Videos - Apple Developer
Learn about the basics of object lifetimes and ARC in Swift. Dive deep into what language features make object lifetimes observable,...
developer.apple.com
Documentation
docs.swift.org
https://github.com/apple/swift/blob/main/stdlib/public/SwiftShims/swift/shims/RefCount.h
swift/stdlib/public/SwiftShims/swift/shims/RefCount.h at main ยท apple/swift
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
github.com
https://shubhamchawla00.medium.com/memory-management-on-ios-ad2244b49b20
Memory management on iOS
Memory Management
shubhamchawla00.medium.com
https://jeonyeohun.tistory.com/373
[Swift] strong, weak, unowned์ ๋น๋ฐ
๋ํผ๋ฐ์ค ์นด์ดํธ ์๋ ํ์ธ์! ์ค๋์ swift์์ ๋ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๊ณ ์๋์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋ง์ ๋ธ๋ก๊ทธ์์ weak๊ณผ unowned์ ์ฐจ์ด๋ฅผ Optional์ ๊ฐ๋ฅ ์ฌ๋ถ๋ผ๊ณ ๋งํ๊ณ ์๋๋ฐ, ์ฌ
jeonyeohun.tistory.com
'๐ iOS > ๐ถ ๊ถ๊ธ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Swift์ ์ปดํ์ผ๋ฌ _ LLVM (1) | 2024.03.12 |
---|---|
[NSCache&URLCache]์ ์ด๋ฏธ์ง ํ์ผ์ด URLCache์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋์คํฌ์ ์ ์ฅ๋ ๊น? (0) | 2024.01.28 |
[UIKit]loadView์ view๋ ์ธ์ ํ ๋น๋ ๊น? (0) | 2024.01.27 |
[Swift]super.init()์ด ๋ฐ๋์ ํ์ํ๋ ๊ฒฝ์ฐ (0) | 2023.11.08 |