๐ฅ ํค์๋
- App LifeCycle
- Memory
- ARC
- Concurrency
๐ฅ ์์ ์ง๋ฌธ์ง
- AppDelegate์ SceneDelegate์ ๋ํด ์ค๋ช
ํ์์ค.
- AppDelegate๋ ์ฑ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ํธ์ ์๋ฆผ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ, URL ์คํด ์ฒ๋ฆฌ ๋ฑ ์ ๋ฐ์ ์ธ ์ฑ์ ๋์์ ์ ์ดํ๋ ์ญํ ์ ํฉ๋๋ค. iOS 13๋ถํฐ๋ SceneDelegate๊ฐ ๋์ ๋์ด ๋ฉํฐ ์๋์ฐ ํ๊ฒฝ์์ ๊ฐ ์๋์ฐ(๋๋ ์ฅ๋ฉด)์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋์์ต๋๋ค. ์ฆ, AppDelegate๋ ์ฑ ์์ค์์์ ๊ด๋ฆฌ ์ญํ ์ ๋งก๊ณ , SceneDelegate๋ ๊ฐ๊ฐ์ UI ์ฅ๋ฉด(์๋์ฐ)์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- Scene Delegate์ Life Cycle์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- SceneDelegate๋ ๊ฐ Scene์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ฃผ์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- scene(_:willConnectTo:options:): ์๋ก์ด Scene์ด ์ฐ๊ฒฐ๋ ๋ ํธ์ถ๋ฉ๋๋ค. UI๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- sceneDidBecomeActive(_:): Scene์ด ํ์ฑํ๋์ด ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ ์์ ๋ ํธ์ถ๋ฉ๋๋ค.
- sceneWillResignActive(_:): Scene์ด ๋นํ์ฑํ๋ ๋ ํธ์ถ๋ฉ๋๋ค. ์ ํ๊ฐ ์ค๊ฑฐ๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํ๋๊ธฐ ์ง์ ์ํ์ ๋๋ค.
- sceneWillEnterForeground(_:): Scene์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํฌ์ด๊ทธ๋ผ์ด๋๋ก ์ ํ๋ ๋ ํธ์ถ๋ฉ๋๋ค.
- sceneDidEnterBackground(_:): Scene์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํ๋ ๋ ํธ์ถ๋ฉ๋๋ค. ์ด๋ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฑ์ ์์ ์ ํฉ๋๋ค.
- SceneDelegate๋ ๊ฐ Scene์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ฃผ์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- iOS ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- iOS์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ค ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค:
- Stack: ์ง์ญ ๋ณ์, ํจ์ ํธ์ถ ๋ฑ ์ผ์์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
- Heap: ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก, ๊ฐ์ฒด๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- Data Segment: ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์์ static ๋ณ์๊ฐ ์ ์ฅ๋๋ ์์ญ์ ๋๋ค.
- Code Segment (Text Segment): ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ์์ญ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค.
- iOS์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ค ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค:
- ARC์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- ARC(Automatic Reference Counting)๋ Swift์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ํด์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ARC๋ ์ธ์คํด์ค์ ์ฐธ์กฐ ํ์๋ฅผ ์ถ์ ํ๋ฉฐ, ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค.
- ARC์ ๋์๋ฐฉ์์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- ARC๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค:
- ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1๋ก ์ค์ ๋ฉ๋๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋ณ์์์ ์ด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์ฆ๊ฐํฉ๋๋ค.
- ์ฐธ์กฐ๊ฐ ํด์ ๋๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๊ฐ์ํฉ๋๋ค.
- ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค.
- ARC๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค:
- Memory Leak์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- Memory Leak์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์๊ณ ๊ณ์ ์ฐจ์งํ๊ณ ์๋ ์ํ๋ฅผ ๋งํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ฉด ์์คํ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ์ ํ๋ ํฌ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ฃผ๋ก ARC์์ ๊ฐ์ฒด ๊ฐ์ ๊ฐํ ์ํ ์ฐธ์กฐ(Strong Reference Cycle)๋ก ์ธํด ๋ฐ์ํฉ๋๋ค.
- ๊ฐํ ์ํ ์ฐธ์กฐ์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- ๊ฐํ ์ํ ์ฐธ์กฐ(Strong Reference Cycle)๋ ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์์ด ARC๊ฐ ์ด ๊ฐ์ฒด๋ค์ ํด์ ํ ์ ์๋ ์ํฉ์ ๋งํฉ๋๋ค. ์ด๋ก ์ธํด ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
- ๊ฐํ ์ํ ์ฐธ์กฐ๋ ์ธ์ ๋ฐ์ํ๋์ง ์์๋ฅผ ํ๋ ๋ค์ด์ฃผ์ธ์.
- ์๋ฅผ ๋ค์ด, ํด๋์ค A์ ํด๋์ค B๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, ํด๋์ค A์ ์ธ์คํด์ค๊ฐ ํด๋์ค B๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ , ํด๋์ค B์ ์ธ์คํด์ค๋ ํด๋์ค A๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ฉด ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ก ์ธํด ๋ ๊ฐ์ฒด ๋ชจ๋ ํด์ ๋์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ํด๋์ค A์ ํด๋์ค B๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, ํด๋์ค A์ ์ธ์คํด์ค๊ฐ ํด๋์ค B๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ , ํด๋์ค B์ ์ธ์คํด์ค๋ ํด๋์ค A๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ฉด ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ก ์ธํด ๋ ๊ฐ์ฒด ๋ชจ๋ ํด์ ๋์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํด์ฃผ์ธ์.
- ๋ฉ๋ชจ๋ฆฌ๋ฆญ(Memory Leak)์ ๋ฐฉ์งํ๊ธฐ ์ํด, ์๋ก ์ฐธ์กฐํ๋ ๊ฐ์ฒด ์ค ํ๋์ ์ฐธ์กฐ๋ฅผ weak ๋๋ unowned๋ก ์ ์ธํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํตํด ARC๊ฐ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ ๋๋ก ๊ด๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. weak ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ nil์ด ๋ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๊ณ , unowned ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ ์ค์ ํญ์ ์ ํจํ๋ค๊ณ ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
- weak, unowned์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- weak: ์ฝํ ์ฐธ์กฐ๋ก, ARC์์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ต๋๋ค. weak ์ฐธ์กฐ๋ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ์๋์ผ๋ก nil๋ก ์ค์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ weak ์ฐธ์กฐ๋ ํญ์ Optional ํ์ ์ด์ด์ผ ํฉ๋๋ค.
- unowned: ๋น์์ ์ฐธ์กฐ๋ก, ARC์์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ง๋ง, ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ด๋ nil๋ก ์ค์ ๋์ง ์์ต๋๋ค. unowned ์ฐธ์กฐ๋ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ํญ์ ์ ํจํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. unowned ์ฐธ์กฐ๋ Optional์ด ์๋ ์ ์์ต๋๋ค.
- GCD๋ฅผ ์ฌ์ฉํ์ฌ background thread์์ UI๋ฅผ ์
๋ฐ์ดํธ ํ๋ฉด ์ด๋ค์ผ์ด ๋ฐ์ํ๋์?
- iOS์์ UI ์ ๋ฐ์ดํธ๋ ๋ฐ๋์ ๋ฉ์ธ ์ค๋ ๋์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. GCD(Grand Central Dispatch)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๊ณ ํ๋ฉด, UI์ ๋ถ์์ ํ ๋์์ด๋ ํฌ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. UI ๋ณ๊ฒฝ์ ๋ฉ์ธ ํ๋ฅผ ํตํด ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- GCD์์ Serial Queue, Concurrent Queue์ ์ฐจ์ด์ ์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- Serial Queue: ์์ ์ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค. ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์คํ๋๋ฏ๋ก ์์ ์ด ์ฐจ๋ก๋ก ์คํ๋๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
- Concurrent Queue: ์ฌ๋ฌ ์์ ์ ๋์์ ์คํํ ์ ์์ต๋๋ค. ์์ ์ด ์์๋ ์์๋ ๋ณด์ฅ๋์ง๋ง, ์๋ฃ๋๋ ์์๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ๋์์ ์ฌ๋ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ด ํจ์จ์ ์ ๋๋ค.
- GCD์์ sync์ async์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
- sync: ๋๊ธฐ ์คํ์ผ๋ก, ์์ ์ด ์๋ฃ๋ ๋๊น์ง ํ์ฌ ์ค๋ ๋๊ฐ ๋๊ธฐํฉ๋๋ค. ์์ ์ด ์๋ฃ๋ ํ์์ผ ๋ค์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ก ์ธํด ์ค๋ ๋๊ฐ ๋ธ๋ก๋ ์ ์์ต๋๋ค.
- async: ๋น๋๊ธฐ ์คํ์ผ๋ก, ์์ ์ ์์ํ ํ ํ์ฌ ์ค๋ ๋๊ฐ ์ฆ์ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋๋ค. ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ์ง ์์ผ๋ฏ๋ก, ์ค๋ ๋๊ฐ ๋ธ๋ก๋์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ๊ณ์ ์ํํ ์ ์์ต๋๋ค. async๋ ์ฃผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
class A {
var b: B?
}
class B {
var a: A?
}
let aInstance = A()
let bInstance = B()
aInstance.b = bInstance
bInstance.a = aInstance
๋ฐ์ํ
'TIL (Today I Learned)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 2024. 08. 30 (0) | 2024.09.02 |
---|---|
[TIL] 2024. 08. 29 (0) | 2024.08.29 |
[TIL] 2024. 08. 27 (0) | 2024.08.28 |
[TIL] 2024. 08. 26 (0) | 2024.08.26 |
[TIL] 2024. 08. 23 (0) | 2024.08.23 |