ํด๋น ๊ฒ์๊ธ์ iOS ๋ฉด์ ์คํฐ๋ SweepSwift์์ ์งํํ ์ง๋ฌธ ์ค ์ ๊ฐ ๋ด๋น ํ๋ ์ง๋ฌธ์ ๋ต๋ณ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ๋ณด๊ฐํ ๋ด์ฉ์ ๋๋ค.
๐ด unowned์ weak์ ์ฐจ์ด์ ์ ์ค๋ช ํ์ธ์.
์บก์ฒ ๋ฆฌ์คํธ, ๊ฐ์ฒด๊ฐ์ ์ฐธ์กฐ ๋ฑ์ ๊ฒฝ์ฐ์ธ ๊ฐํ ์ฐธ์กฐ ์ํ(Strong Reference Cycle)๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ฐธ์กฐ ํ์ ์ ๋๋ค. ์ฐจ์ด์ ์ ์๋์ ๊ฐ์ต๋๋ค.
๐ unowned
- unwoned๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ๊ฐ(value)์ด ํญ์ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ํ ๋นํด์ ๋ฅผ ํด๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ต๋๋ค.
- unowned๋ ๊ฐ์ ๋ฐ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. ๋์ unowned ์ฐธ์กฐ๋ ํ ๋นํด์ ๊ฐ ๋ ์ํ์ผ ๋ nil๋ก ์ค์ ๋์ง ์๊ธฐ ๋๋ฌธ์ (์ฆ, ๊ฐ์ฒด๊ฐ ARC์ ์ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ด๋ ๊ฐ์ด ์๋ค๊ณ ์ธ์งํ๊ธฐ ๋๋ฌธ์) ํ ๋นํด์ ๋ ๊ฐ์ฒด์ ์ ๊ทผํ ๋ fatal error๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ==> ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ฃผ์๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์ด์, ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ก๋ค๊ณ ํ๋๋ผ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ค๋๋ผ๋ ๊ณณ์์ ์ฌ์ ํ ๋ณด์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ค๋๋ฅผ ํธ์ถํ๋ฉด ์ ์ ๊ฐ์ ๊ฐ์ง๊ณ ์ค๋ ค๊ณ ํฉ๋๋ค. ์ด๋ฌํ ๊ณผ์ ๋๋ฌธ์ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ์๋ช ์ด ์งง์ ๋จผ์ ํด์ ํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํฉ๋๋ค.
๐
weak- weak์ ๊ฒฝ์ฐ์ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค์ ๊ฐ์ด nil์ผ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํฉ๋๋ค. ํน์ ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ํ ๋นํด์ ๋์์ ๊ฒฝ์ฐ ์ฐธ์กฐ๋ฅผ nil๋ก ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
- weak๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ nil์ ์ค์ ๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ํญ์ optional๋ก ์ ์ธ๋จ์ผ๋ก, unrappingํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
- ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ์๋ช ์ด ๋น์ทํ๊ฑฐ๋ ๋ ๊ธด ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
โ๋ฐ์๋ ์ง๋ฌธ
์ด์๋๋ฐ ํ์คํ๊ฒ ๋๋ต์ ๋ชป ํด์ ์ ๋ฆฌ.
* unowned์ weak๋ ์ธ์ ์ฌ์ฉ์ด ๋๋ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ, unowned๊ฐ ์ค์ ๋ก๋ ์ ์ฐ์ด์ง ์๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์?
์ด ์ง๋ฌธ์ ๋ฐ๊ณ ๊ฐ๋ ๋ง ์ค๋นํ๋ ํฐ๋ผ ์กฐ๊ธ ๋นํฉ ํ์๋๋ฐ, ์๊ฐํด๋ณด๋ฉด ์ฌ์ฉ ์์ ์ ์ฐจ์ด๋ ๊ฐ๋จํ๋ค. ์์ ์ ๋ฆฌํ๋ ์ฐจ์ด์ ์ด ๊ณง unowned์ weak ์ฌ์ฉ์ ์ฐจ์ด์ ์ด์๋ค. nil๊ฐ์ด ๋์ฌ ์ ์๋ ์ํฉ์์ nil์ ์ํฉ์ ๊ณ ๋ คํ๋ weak๋ฅผ ์ฌ์ฉํ๊ณ , ๋ฌด์กฐ๊ฑด ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ unowned๋ฅผ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ์๋ช ์ ๋ฐ๋ผ ์ํฉ์ ๋ง์ถฐ ์ฐ๋ฉด ๋๋ค. ์ฆ, unowned๋ ๊ฐ์ด ํญ์ ์กด์ฌํ๋ ์ํฉ์์๋ง ์ฌ์ฉ๋์ด์ผ ํ๊ณ , weak๋ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค์ ์๋ช ์ ๋ํ ๋ถํ์ค์ฑ์ด ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
์คํฐ๋์์ unowned๊ฐ ์ค์ ๋ก๋ ์ ์ฐ์ด์ง ์๋ ์ด์ ์ ๋ํด ์๋ก ์๊ฒฌ์ ์กฐ๊ธ ๋๋์์๋๋ฐ, ์๋ฌด๋๋ ์์ ์ฑ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ธ swift ๊ธฐ๋ฐ์์์ ์์คํ ์ด๋ผ nil์ ์ฌ๋ถ๊ฐ ๊ทธ ์ด์ ๋ก ๊ฐ์ฅ ์ปธ๋ ๊ฒ ๊ฐ๋ค. ํน์ฌ๋ผ๋ nil์ด ๋์ค๋ ๊ฒฝ์ฐ, ์๋ฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ ๋ฐฉ์ง๋ฅผ ์ํด unowned๋ณด๋ค nil์ด ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ weak๊ฐ ๋ ์์ฃผ ์ฌ์ฉ๋์ด ์๋ ๊ฒ.
(+)
Use an unowned reference only when you are sure that the reference always refers to an instance that hasn’t been deallocated. If you try to access the value of an unowned reference after that instance has been deallocated, you’ll get a runtime error. nil ์ ๋ฌด์ ๋ํด์ ๊ณต์๋ฌธ์์๋ ํน๋ณํ ์ฃผ์๋ฅผ ์ฃผ๊ณ ์๋ค. ๋ฐํ์ ์๋ฌ ์์ด unowned๋ฅผ ์ฌ์ฉํ ๋ ค๋ฉด ํ ๋นํด์ ๊ฐ ๋์ง์์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์์์ ํ์ ํ ์ ์์ ๋ ์ฌ์ฉํด์ผํ๋ค๊ณ . |
๋ณด๊ฐ ๋ถ๋ถ
๐ ARC
๋ณธ๊ฒฉ ARC๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ , ARC์ ์ง๊ถ(?) deinit ์ด์ผ๊ธฐ๋ฅผ ์ ํ ์๊ฐ ์๋ค.
deinit{
print("deinit", self)
}
deinit์ด๋?
- ํ์ด์ง๊ฐ ๊ณ์ ์์ด๋ ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํจ.
- ํ๋ฉด์ด ๋ด๋ค๊ฐ ์ฌ๋ผ์ก๋ค๊ณ ์ฌ์ฉ์ ๋ ๋ฟ๋ง ์๋๋ผ ์ค์ ๋ก ์๋ก์ด ํ๋ฉด์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์ง๊ฒ ํจ.
์ ๋๋ก ์ ๋ฆฌํ ์ ์๋๋ฐ, ๋ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ์๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๊ฐ ๋ ๋๊ณ ์์ง ์๋์ง ๊ฐ๋ฐ์๊ฐ ์ง์ ํ์ธํ ์ ์๋ ์ฝ๋๋ผ๊ณ ๋ณผ ์ ์๋ค. ํ๋ฉด์์์ ์ฌ๋ผ์ก๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋๋ก ํด์ ๋์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์๋ค๋ฉด......... ๊ณค๋ํด์ง๋๋ฐ, ๊ทธ๊ฑธ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ์ธํ ์ ์๋จ ๋ป!
ARC ๋ฑ์ฅ ์ด์ ์ MRC๊ฐ ์์๋๋ฐ, ์๋์ด๋ผ๋ ํน์ง์ด์๋ค. ์ฌ์ค ์์ ๋ ์ด๋ฐ ๊ฒ ์๋ค~ ์์ผ๋ก ์ ํ๋ฉฐ ARC์์ ์ฐจ์ด์ ์ ์ค์ ์ ๋๊ณ ๋ฐฐ์์ ARC ๊ณต๋ถํ๋ ๊น์ ์กฐ๊ธ ๋ ์ฐพ์๋ณด์๋ค.
MRC
Manual Reference Counting
- ๋ฌด๋ ค object-c ๋ ์ฌ์ฉ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฒ.
- ์ด๋ฆ์์ ๋ํ๋์๋ฏ์ด ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋, retain (๊ฐ์ฒด์ ์ฆ๊ฐ), relese (๊ฐ์ฒด์ ๊ฐ์) ๋ฑ์ ํตํด ๊ด๋ฆฌํ๋ค.
- ๋ฐํ์ ์์ ์ ๊ฒฐ์ ๋๋๋ฐ, ํ๋์ฉ ๋ค ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ผ ์ฑ์ด ์กฐ๊ธ ํ๋ค์ดํ ์ ์๋จ ๋จ์ ์ด ์๋ค.
์ฐธ๊ณ ๋ก, Refrence Counting (์ดํ RC)๋ ์ ํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ฐธ์กฐํด์ ์ฌ์ฉํ ๋ ์นด์ดํ ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค. ์ฐธ์กฐํ ๋ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค๊ณ , ์ฌ์ฉ์ ๋คํ๋ฉด ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ๊ฐ์ํ๋ ๋ฐฉ์์ด๋ค. RC๊ฐ 0์ธ ๊ฒฝ์ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธฐ์ง ์๊ณ ์์ ๋์ด์, ์ฐ๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ ์งํด์ฃผ์ด์ผํ๋ ๊ฒฝ์ฐ์ด๊ธฐ๋ ํ๋ค.
์ด๋ ๊ฒ ์๋์ผ๋ก ๊ด๋ฆฌ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ WWDC 11์ ARC๊ฐ ๋ฑ์ฅํ๋ฉฐ ๋ฌ๋ผ์ก๋๋ฐ .......
ARC
Automatic Reference Counting
Swift uses Automatic Reference Counting (ARC) to track and manage your app’s memory usage. In most cases, this means that memory management “just works” in Swift, and you don’t need to think about memory management yourself. ARC automatically frees up the memory used by class instances when those instances are no longer needed. |
์ค์ํ ๊ฐ๋ ์ด๋ผ ๊ณต์๋ฌธ์๋ฅผ ํ์ธํด๋ณด์๋ค. ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํ์๋ฉด, ARC๋ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ถ์ ๋ฐ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๋ ์ญํ ์ ํ๊ณ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ swift ํ๊ฒฝ์ผ ์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ํฌ๊ฒ ์ผ๋ํ์ง ์์๋ ๋๋ค๋ ๊ฒ.
๊ทธ๋ฐ๋ฐ ๋ณธ๋ฌธ ์ ARC ์๋์ ๋ณธ๊ฒฉ์ ์ผ๋ก ํ๊ธฐ ์ ๋ด ๋์ ๋ค์ด์จ
"In most cases"
"In most cases"
"In most cases"
"In most cases"
์ฆ ์์ธ์ ๊ฒฝ์ฐ๋ ์๋ค๋ ๊ฒ........
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์์ผ ํ๋ ๊ฒ unowned์ weak ์๋ค. ๋ณดํต์ ๊ฒฝ์ฐ swift๊ฐ ์์์ ARC๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๊ฒ ์ง๋ง, ๊ฐํ ์ํ์ฐธ์กฐ์ ์ํฉ์์ ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๋๋ก ํด์ค ์๊ฐ ์์ด์ memory leak... ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ฒฝ์ฐ์ ๋ณ๋์ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ฐ, ๊ทธ ์ญํ ์ unowned์ weak๊ฐ ์ฒ๋ฆฌ ํด์ฃผ๊ณ ์๋ ๊ฒ.
๐Refereances
'๐ Dev > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Keychain vs UserDefaults (0) | 2023.12.17 |
---|---|
[Swift] Method Dispatch (0) | 2023.12.02 |