๐ iOS ์ฑ์ Objective-C ๊ธฐ๋ฐ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ์ฑ์ main ํจ์์์ ์์ํจ
ใใ๐ ์ด๋, iOS์ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ UIKit framework๊ฐ main ํจ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฑ ๊ฐ๋ฐ์๋ค์ด ์ง์ main ํจ์์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์
๐ UIKit์ main ํจ์๋ฅผ ๋ค๋ฃจ๋ ๊ณผ์ ์์ UIApplicationMain ํจ์๋ฅผ ํธ์ถ
๐ UIApplicationMain ํจ์๋ UIApplication ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑ
ใใ๐ UIApplication ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ํตํด ์ฑ ๊ฐ๋ฐ์๋ ์ฑ์ ์คํ์ ๋ถ๋ถ์ ์ผ๋ก ๊ด์ฌํ ์ ์๊ฒ ๋จ
๐ ๋ค์, Info.plist ํ์ผ์์ ์ฑ ๊ตฌ์ฑ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๋, Main Nib ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ด ๊ณผ์ ์์ ๋ก๋๋จ
๐ ์ดํ, AppDelegate ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ Delegate๋ฅผ ์์ํ ํ, Main Run Loop๋ฅผ ์์ฑํ๋ ๋ฑ ์ฑ ์คํ์ ํ์ํ ์ค๋น๋ฅผ ๋ง๋ฌด๋ฆฌ
๐ ์ค๋น๊ฐ ์๋ฃ๋๋ฉด, AppDelegate์ didFinishlaunchingWithOptions()๋ฅผ ํธ์ถ
๐ UIApplication์ UIApplicationMain์์ ๋ง๋ค์ด์ง๋ ์ฑ๊ธํค ๊ฐ์ฒด
ใใ๐ UIApplication.shared ํํ๋ก ์ฑ ์ ์ญ์์ ์ ๊ทผ์ด ๊ฐ๋ฅ
ใใ๐ ์ญ์ผ๋ก, UIApplicationMain ํจ์๋ UIApplication ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํจ์
๐ Main Run Loop๋ฅผ ์์ฑ ๋ฐ ์คํํ๋ ๋ฑ์ ์ญํ ์ ๋ด๋น
๐ ์ ์ ๊ฐ ์ผ์ผํค๋ ์ด๋ฒคํธ๋ค์ ์ฒ๋ฆฌํ๋ ํ๋ก์ธ์ค
๐ ์ด Loop๋ฅผ ํตํ์ฌ View ๊ด๋ จ ์
๋ฐ์ดํธ ๋ฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํจ
๐ View์ ๊ด๋ จ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์, Main Thread์์ ์คํ๋จ
๐ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๊ณผ์
ใใ๐ ๋ฒํผ ํฐ์น์ ๊ฐ์ ์ ์ ์ด๋ฒคํธ ๋ฐ์
ใใ๐ ์์คํ
์ ํตํด ์ด๋ฒคํธ๊ฐ ์์ฑ๋จ
ใใ๐ UIKit ํ๋ ์์ํฌ๋ฅผ ํตํด ์์ฑ๋ port๋ก ํด๋น ์ด๋ฒคํธ๊ฐ ์ฑ์ ์ ๋ฌ๋จ
ใใ๐ ์ด๋ฒคํธ๋ ์ฑ ๋ด๋ถ์ ์ผ๋ก Queue์ ํํ๋ก ์ ๋ฆฌ๋๊ณ , Main Run Loop์ ํ๋์ฉ Mapping ๋จ
ใใ๐ UIApplicationย ๊ฐ์ฒด๋ ์ด๋ ์ด๋ค ์ด๋ฒคํธ๋ถํฐ ์ฒ๋ฆฌํ ์ง๋ฅผ ๊ฒฐ์
๐ ๋ฐ์ํ ์ด๋ฒคํธ๋ค์ ๋ชจ๋ ์ฒ๋ฆฌํ๊ณ ๊ถํ์ด ๋ค์ Main Run Loop๋ก ๋์์ค๋ ์์ ์ update cycle์ด๋ผ ํจ
๐ Link
๐ ์ด๋ฒคํธ๋ UIEvent ๊ฐ์ฒด๋ก ์ ๋ฌ๋จ
๐ ํฐ์น ์ด๋ฒคํธ๋ UITouch ๊ฐ์ฒด๋ก ๊ด๋ฆฌ๋๊ณ UIEvent ๊ฐ์ฒด๋ฅผ ํตํด ์ ๊ทผํ ์ ์์
๐ UITouch ๊ฐ์ฒด๋ ํฐ์น๋ ์์น, ํฐ์น ๊ฐ๋, ์์ง์ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจ
๐ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ View๊ฐ ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ ์๊ฒ๋ ๋ฅ๋ ฅ์ ๋ถ์ฌํด์ฃผ๋ ํด๋์ค
๐ Target-Action ๋งค์ปค๋์ฆ์ ์ด์ฉํด ์ฌ์ฉ์์ ์ก์
๋ค์ ์ฑ์ ์ ๋ฌํ๋ฉฐ, addTarget ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ
๐ addTarget์ ํ๋ผ๋ฏธํฐ 3๊ฐ์ง
ใใ๐ target : ์ก์
์ ๋ด๋นํ ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ, ์ฃผ๋ก self
ใใ๐ action : ์ก์
์ ๋ํ ํ์๋ฅผ ์ ์ํ ๋ฉ์๋๋ฅผ ์ ํํ๋ ํ๋ผ๋ฏธํฐ, #selector(objc)
ใใ๐ controlEvents : ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ก์
์ ์คํ์ํฌ ๊ฒ์ธ์ง ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ
๐ ๋ฐํ์ ์์ ์ ํจ์ ํ
์ด๋ธ์์ ํจ์ ์ด๋ฆ์ ์ฐธ์กฐํ์ฌ ๋ฉ์๋๋ฅผ ์ ํํด ์คํํ๋ ์ญํ
๐ Objective-C์์ ํธํ์ฑ์ ์ํด ๋ฐ๋์ @objc ํค์๋๋ฅผ ๋ถ์ฌ์ค์ผ ํจ
ใใ๐ @objc๋ Swift๋ก ์์ฑํ ๋ฉ์๋๋ฅผ Objective-C๋ก ์ธ์ํ๊ฒ ํ๋ ์ญํ
๐ App์ ์คํ ๋ฐ ์ข
๋ฃ ๋ฑ ์์คํ
์ด ๋ฐ์์ํค๋ Event์ ์ํด App์ ์ํ๊ฐ ์ ํ๋๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋ปํจ
๐ iOS 13 ์ดํ (SceneDelegate.swift ์์)
ใใ
ใใ๐ Unattached
ใใใใ๐ Scene์ด๋ ์ฐ๊ฒฐ๋์ง ์์ ์ํ
ใใใใใใ๐ ์ฑ์ด ์คํ๋์ง ์์ Not Running๊ณผ ์ฐจ์ด๊ฐ ์์
ใใ๐ Foreground Inactive
ใใใใ๐ ์คํ ์ค์ด์ง๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์์ง ์์ ์ํ
ใใใใ๐ ์ฑ ์คํ ์ค ์๋ฆผ ๋ฑ์ผ๋ก ํ๋ฉด์ด ๋ฎ์ฌ ์ค์ง์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ ์ํ
ใใใใใใ๐ ์๋ฆฌ๊ฐ ์ผ์ง
ใใใใใใ๐ ์ ํ ์์
ใใใใใใ๐ ๋ฐฐํฐ๋ฆฌ ๋ถ์กฑ ์๋ฆผ
ใใ๐ Foreground Active
ใใใใ๐ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ค์ง์ ์ผ๋ก ํ๋ํ๊ณ ์๋ ์ํ
ใใ๐ Background
ใใใใ๐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์ ์ค์ง์ ์ธ ๋์์ ํ๊ณ ์๋ ์ํ
ใใใใ๐ ex) ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์
์ ์คํ
ใใ๐ Suspend
ใใใใ๐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์ ํ๋์ ๋ฉ์ถ ์ํ
ใใใใ๐ ๋น ๋ฅธ ์ฌ์คํ์ ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ์ํ์ง๋ง ์ค์ง์ ์ผ๋ก ๋์์ ํ๊ณ ์์ง ์๋ ์ํ
ใใใใ๐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ์์คํ
์ด ๊ฐ์ ์ข
๋ฃ
ใใโญ๏ธ UISceneDelegate๋ฅผ ํตํด Scene ๊ธฐ๋ฐ ์ฑ์ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํจ
ใใ๐ ์ฑ์ด Scene์ ์ง์ํ๋ค๋ฉด, UIKit์ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ ์กํจ
ใใ๐ Scene : ์คํ๋๊ณ ์๋ ํ๋์ ์ฑ UI ์ธ์คํด์ค๋ฅผ ๋ปํ๋ฉฐ ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ์์ ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์
ใใใใ๐ ๊ฐ์์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ค๋ฅธ ์ํ์ ์์ ์ ์์
ใใ๐ Scene ๊ธฐ๋ฐ ์ฑ์ด๋๋ผ๋ ๋ถ๊ฐ์ ์ธ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ UIApplicationDelegate๊ฐ ํ์ํจ
ใใใใ๐ ์ฑ ์์ ๋ฐ ์ข
๋ฃ ๊ด๋ จ ์ด๋ฒคํธ
๐ฅ iOS 12 ์ด์ (SceneDelegate.swift ์์)
ใใ
ใใ๐ Not Running
ใใใใ๐ ์คํ๋์ง ์์๊ฑฐ๋, ์์คํ
์ ์ํด ์ข
๋ฃ๋ ์ํ
ใใ๐ Inactive
ใใใใ๐ ์คํ ์ค์ด์ง๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์์ง ์์ ์ํ
ใใใใ๐ ์ฑ ์คํ ์ค ์๋ฆผ ๋ฑ์ผ๋ก ํ๋ฉด์ด ๋ฎ์ฌ ์ฑ์ด ์ค์ง์ ์ผ๋ก ์ด๋ฒคํธ๋ ๋ฐ์ง ๋ชปํ๋ ์ํ
ใใใใใใ๐ ์๋ฆฌ๊ฐ ์ผ์ง
ใใใใใใ๐ ์ ํ ์์
ใใใใใใ๐ ๋ฐฐํฐ๋ฆฌ ๋ถ์กฑ ์๋ฆผ
ใใ๐ Active
ใใใใ๐ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ค์ง์ ์ผ๋ก ํ๋ํ๊ณ ์๋ ์ํ
ใใ๐ Background
ใใใใ๐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์ ์ค์ง์ ์ธ ๋์์ ํ๊ณ ์๋ ์ํ
ใใใใ๐ ex) ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์
์ ์คํ
ใใ๐ Suspend
ใใใใ๐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์ ํ๋์ ๋ฉ์ถ ์ํ
ใใใใ๐ ๋น ๋ฅธ ์ฌ์คํ์ ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ์ํ์ง๋ง ์ค์ง์ ์ผ๋ก ๋์์ ํ๊ณ ์์ง ์๋ ์ํ
ใใใใ๐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ์์คํ
์ด ๊ฐ์ ์ข
๋ฃ
ใใโญ๏ธ UIApplicationDelegate๋ฅผ ํตํด ์ฑ์ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํจ
๐ Link
๐ AppDelegate
ใใ๐ AppDelegate๋ ์ด๋ฆ ๊ทธ๋๋ก ์ฑ๊ณผ ์์คํ
์ ์ฐ๊ฒฐ์ ์ํด ํ์ํ Delegate ๋ฉ์๋๋ฅผ ๋ด๊ณ ์์
ใใ๐ ์ฆ, ์ฑ์ ์ํ์ ๋์ํ ์ ์๋ ๋ฉ์๋๋ค์ด ๋ค์ด์์
ใใ๐ UIResponder์ UIApplicationDelegate๋ฅผ ์์ ๋ฐ ์ฐธ์กฐ
ใใ๐ iOS 13 ์ดํ, UI Lifecycle์ ๋ํ ์ญํ ์ ๋ด๋นํ์ง ์์
ใใใใ๐ ์ ํ ํธ์ฌ ์๋ฆผ ์๋น์ค์ ๊ฐ์ด, ์คํ ์ ์๊ตฌ๋๋ ๋ชจ๋ ์๋น์ค๋ฅผ ๋ฑ๋กํ๋ ์ญํ
ใใใใ๐ Session LifeCycle์ ๋ํ ์ญํ ์ด ์ถ๊ฐ ๋์์
ใใใใใใ๐ Scene Session์ ํตํด ์ฑ์์ ์์ฑํ ๋ชจ๋ Scene์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌ
ใใใใใใใใ๐ Scene Session
ใใใใใใใใใใ๐ Scene์ ์ถ์ ํ๋ Session ๊ฐ์ฒด
ใใใใใใใใใใ๐ Session์๋ ๊ณ ์ ํ ์๋ณ์์ Scene์ ๊ตฌ์ฑ ์ธ๋ถ์ฌํญ์ด ๋ค์ด ์์
๐ SceneDelegate
ใใ๐ iOS 13 ์ดํ, AppDelegate์ ์ญํ ์ค UI Lifecycle์ ๋ํ ์ญํ ์ SceneDelegate์์ ๋ด๋นํ๊ฒ ๋จ
ใใ๐ UIResponder์ UIWindowSceneDelegate๋ฅผ ์์ ๋ฐ ์ฐธ์กฐ
๐ AppDelegate
ใใ๐ application:willFinishLaunchingWithOptions: ์ ํ๋ฆฌ์ผ์ด์
์ด ์ต์ด ์คํ๋ ๋ ํธ์ถ๋๋ ๋ฉ์๋
ใใ๐ application:didFinishLaunchingWithOptions: ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ์งํ ์ฌ์ฉ์์ ํ๋ฉด์ ๋ณด์ฌ์ง๊ธฐ ์ง์ ์ ํธ์ถ
ใใ๐ applicationWillTerminate: ์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋๊ธฐ ์ง์ ์ ํธ์ถ
๐ SceneDelegate
ใใ๐ scene(_ willConnectTo: options:): scene์ด ์ฑ์ ์ถ๊ฐ๋ ๋ ํธ์ถ
ใใ๐ sceneDidBecomeActive(:): scene๊ณผ์ ์ํธ์์ฉ์ด ์์๋ ๋ ํธ์ถ
ใใ๐ sceneWillEnterForeground(:): scene์ด Foreground๋ก ์ง์
ํ ๋ ํธ์ถ
ใใ๐ sceneDidEnterBackground: scene์ด Background์ ์ง์
ํ ํ ํธ์ถ
๐ makeKeyAndVisible : key window๋ก ์ค์
ใใ๐ key window : window๊ฐ ์ฌ๋ฌ๊ฐ ์กด์ฌํ ๋, ๊ฐ์ฅ ์์ชฝ์ ๋ฐฐ์น๋ window๋ฅผ key window๋ก ์ง์นญ
๐ Responder๋ UIResponder์ ์ธ์คํด์ค, UIKit์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ค์ถ ์ญํ ์ ํจ
๐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด UIKit์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Responder ๊ฐ์ฒด์๊ฒ ์ ๋ฌํ์ฌ ์ฒ๋ฆฌํ๋๋ก ํจ
ใใ๐ UIView, UIViewController ๋ฑ ๋ง์ UIKit์ ํต์ฌ ๊ฐ์ฒด๋ค์ ๋ชจ๋ UIResponder ์ธ์คํด์ค์
๐ ์ฃผ์ด์ง Responder๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ ํ์ง ์์ ๊ฒฝ์ฐ, Responder Chain์ ๋ค์ Responder๋ก ํด๋น ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ
ใใ๐ Responder Chain
ใใใใ๐ UIKit์ด ๋ชจ๋ Responder๋ฅผ ์ฎ์ด์ ๊ด๋ฆฌํ๋ ์ฒด์ธ
ใใใใ๐ UIkit์ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น์ ์ฌ์ฉํ์ฌ ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ด๋ฒคํธ๋ฅผ ์์ ํ ๋ค์์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ ํํ ์ง ๊ฒฐ์
ใใใใ๐ ๊ฐ Responder๋ next ํ๋กํผํฐ๋ก ์์ ์ ๋ค์ ๋ฆฌ์คํฐ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์์
ใใใใ๐ next ํ๋กํผํฐ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ๋ค์ ๋ฆฌ์คํฐ๋๋ฅผ ์์๋ก ๋ณ๊ฒฝํ ์ ์์
ใใใใใใ๐ becomeFirstResponder ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํน์ ํ ๋ทฐ๋ฅผ First Responder๋ก ๋ง๋ค ์ ์์
ใใใใใใใใ๐ ํด๋น ๊ฐ์ฒด๋ฅผ ์ง๊ธ ์๋์ฐ์ First Responder๋ก ๋ง๋ค์ด ์ค ๊ฒ์ ์์ฒญํ๋ ํจ์
ใใใใใใใใใใ๐ ํ์ง๋ง, ๋ฌด์กฐ๊ฑด First Responder๊ฐ ๋๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์
ใใใใใใใใ๐ ์ฃผ๋ก, ํค๋ณด๋๋ฅผ ์ฌ๋ฆฌ๋ ์ก์
์ ์ทจํ๊ธฐ ์ํด ์ด ํจ์๋ฅผ ํธ์ถ
ใใใใใใ๐ ๋ฐ๋๋ก resignFirstResponder ๋ฉ์๋๋ ์กด์ฌํจ
ใใใใใใใใ๐ ํด๋น ๊ฐ์ฒด์๊ฒ ์ง๊ธ ์๋์ฐ์ First Responder๋ก์์ ์ํ๋ฅผ ํฌ๊ธฐํ๋ค๋ ์์ฒญ์ ์๋ฆฌ๋ ํจ์
ใใใใใใใใ๐ ์ฃผ๋ก, ํค๋ณด๋๋ฅผ ๋ด๋ฆฌ๋ ์ก์
์ ์ทจํ๊ธฐ ์ํด ์ด ํจ์๋ฅผ ํธ์ถ
ใใใใ๐ ๊ธฐ๋ณธ์ ์ผ๋ก UIView โก๏ธ UIViewController โก๏ธ UIWindow โก๏ธ UIApplication โก๏ธ UIApplicationDelegate ์์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋จ
ใใ๐ First Responder
ใใใใ๐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ๊ฐ์ฅ ์ ์ ํ ๋ฆฌ์คํฐ๋ ๊ฐ์ฒด
ใใใใ๐ ๋ฐ์ํ ์ด๋ฒคํธ์ ํ์
์ ๊ธฐ์ค์ผ๋ก First Responder๋ฅผ ๊ฒฐ์
๐ UIApplication ๊ฐ์ฒด์ ์์ ์ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ฉ์๋๋ค์ ๋ด๊ณ ์์
๐ UIWindowSceneDelegate๋ฅผ ํตํด Scene ๊ธฐ๋ฐ ์ฑ์ UI ์๋ช
์ฃผ๊ธฐ ๊ด๋ จ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํจ
๐ UISceneDelegate๋ฅผ ์์๋ฐ๋ ์๋ธํด๋์ค
๐ UIView์ ํ์ ํด๋์ค๋ก, ๋ชจ๋ View๋ค์ ์ปจํ
์ด๋ ์ญํ ์ ํจ
๐ UI์ ๋ฐฐ๊ฒฝ์ ์ ๊ณตํ๊ณ , ์ค์ํ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ๋งค๊ฐ์ฒด ์ญํ
ใใ๐ ex) ํ๋ฉด ๋ฐฉํฅ ์ ํ
๐ UIView ํด๋์ค์ ์ธ์คํด์ค
๐ ํ๋ฉด์ ์ง์ฌ๊ฐํ ์์ญ์ ์ฝํ
์ธ ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํ๋ UI์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์
๐ UIbutton, UIImageView์ ๊ฐ์ ๋ชจ๋ ๋ทฐ ํด๋์ค์ ์์ ํด๋์ค
๐ UIView๋ ๊ฐ์ฒด์ ๋ํ๋๋ ์ฝํ
์ธ ๋ค์ ๊ด๋ฆฌํ๋ CALayer ํ์
์ layer๋ฅผ ๊ฐ์ง๊ณ ์์
๐ ์ฆ, UIView๋ ์ด๋ฏธ์ง๋ ์ ๋๋ฉ์ด์
๋ค์ ์ง์ ์ ์ดํ์ง ์๊ณ , View์๊ฒ ์์
์ ์ฃผ๋ฉด View ๋ด๋ถ์ Layer ๊ฐ์ฒด์์ ๋์ ์ฒ๋ฆฌ
๐ view๋ UIKit์ ํ ์์์ด๊ณ , layer๋ Core Animation์ ํ ์์
๐ ๊ทธ๋ํฝ์ ๊ทธ๋ฆฌ๊ธฐ ์ํด์๋ ๊ทธ๋ํฝ ํ๋์จ์ด(GPU)์ ์ ๊ทผํ์ฌ ์ง์ ๊ทธ๋ฆฌ๋ ๊ฒ(OpenGL)์ด ๋ ๋๋ง๊ฐ ๊ฐ์ฅ ์๋๊ฐ ๋น ๋ฅด์ง๋ง ์ฝ๋์ ์์ด ๋ง์์ง๋ ๋จ์ ์ด ์กด์ฌ
๐ ๋ฐ๋ผ์, ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ ํ์ Core Graphics < Core Animation < UIKit & AppKit ํ๋ ์์ํฌ๋ฅผ ๋ง๋ฆ
ใใ๐ ํ๋ ์์ํฌ๊ฐ ์ ์์ค์ผ์๋ก ๊ณ ์์ค์ ๋นํด ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ์ ์ฒด์ ์ธ ์ฝ๋๋์ด ๋ง์
ใใ๐ ํ๋ ์์ํฌ๊ฐ ๊ณ ์์ค์ผ์๋ก ์ ์์ค์ ๋นํด ์ ์ฐ์ฑ์ ๋จ์ด์ง์ง๋ง ์ฌ์ฉ์ด ๊ฐํธํ๊ณ ์ฝ๋๋์ด ์ ์
๐ ์ฆ, layer๋ UIkit๋ณด๋ค ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ํด์๋ ์ง์ ๊ตฌํํ์ฌ ์ฌ์ฉํ์ฌ์ผ ํ๋ค๋ ๋จ์ ์ด ์์
๐ ๋ชจ๋ View Controller ๊ฐ์ฒด์ ์์ ํด๋์ค
๐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ๋ทฐ๋ฅผ ์
๋ฐ์ดํธํ๊ณ , ๋ทฐ์์ ๋ฐ์ํ๋ ์ฌ์ฉ์ ์ด๋ฒคํธ์ ์ํธ์์ฉํ๋ ๋ฑ์ ์ญํ ์ ๊ฐ๊ณ ์์
๐ UIViewController๋ UIResponder๋ฅผ ์์ํ๊ณ , UIResponder๋ NSObject๋ฅผ ์์
ใใ๐ NSObject๋ ๋๋ถ๋ถ์ Objective-C ํด๋์ค์ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฃจํธ ํด๋์ค๋ก, ํ์ ํด๋์ค์์ ๋ฐํ์ ์์คํ
๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํจ
ใใใใ๐ ๋ฐํ์ ์์คํ
์ Objective-C ์ฉ ์ด์์ฒด์ ๊ฐ์ ๊ฒ์ผ๋ก, ๊ฐ์ฒด ์์ฑ ๋ฐ ํด์ ์ ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ ๊ด๋ฆฌ ๋ฑ์ ์ญํ ์ ํจ
๐ iOS ๋ค๋น๊ฒ์ด์
์คํ์ ํ๋ฉด๋ค์ ์์์ ํ๋ฉด ๊ฐ ์ด๋์ ๊ด๋ฆฌํ๋ ์ปจํ
์ด๋
๐ ๋ค๋น๊ฒ์ด์
๋ฐ์์๋ ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ๊ณผ ์ปค์คํฐ๋ง์ด์งํ ๋ฒํผ์ ์ถ๊ฐํ ์ ์์
๐ ๊ด๋ จ ๊ฐ๋
ใใ๐ navigationController?.navigationBar.prefersLargeTitles = true / false
ใใใใ๐ ๋ค๋น๊ฒ์ด์
๋ฐ ํ์ดํ์ ํฐ ๊ธ์จ๋ฅผ ์ถ๋ ฅํ ์ ์๊ฒํจ์ ์ค์ ํ๋ ์์ฑ
ใใใใ๐ root์์ ํ ๋ฒ๋ง ์ค์ ํ, ๊ฐ ํ๋ฉด์์ navigationItem.largeTitleDisplayMode๋ก ์ง์
ใใใใใใ๐ navigationItem.largeTitleDisplayMode = .always / .never
ใใใใใใใใ๐ ๋ค๋น๊ฒ์ด์
๋ฐ ํ์ดํ์ ํฐ ๊ธ์จ๋ฅผ ์ถ๋ ฅํจ / ํฐ ๊ธ์จ๋ฅผ ์ถ๋ ฅํ์ง ์์
ใใ๐ Navigation Prompt
ใใใใ๐ navigation title ์์ชฝ์ ๋ถ๊ฐ์ ์ธ ์ค๋ช
์ ํ ์ ์๋๋ก ์ค์ ํ๋ ๊ฒ
๐ ex) A์์ present B, B์์ present C๋ฅผ ํ ๊ฒฝ์ฐ
ใใ๐ B์ presentedViewController C
ใใ๐ B์ presentingViewController๋ A
๐ viewDidLoad()
ใใ๐ ๋ทฐ๊ฐ ์์ฑ๋ ๋, ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ ๋ฉ์๋
ใใ๐ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋จ ํ ๋ฒ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ ํ ๋ ์ฌ์ฉ
ใใใใ๐ฅ super.viewDidLoad()๋ฅผ ์ ๊ฑฐํ๋ฉด?
ใใใใใใ๐ ์์ ํด๋์ค์ viewDidLoad๋ฅผ ํธ์ถํ์ง ์์๋ ๋ฌธ์ ๋ ์ผ์ด๋์ง X
ใใใใใใ๐ But, UIKit์ viewDidLoad๊ฐ ์ธ์ ๊ตฌํ์ด ๋ฐ๋์ง ๋ชจ๋ฅด๊ณ , ๋ด๋ถ์ ์ค์ํ ์ด๊ธฐํ ์ฝ๋๊ฐ ๋ค์ด๊ฐ ์๋ ์์
ใใใใใใ๐ So, ๋น์ฅ ์ํฅ์ด ์๋๋ผ๋ super.viewDidLoad๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค๊ณ ์๊ฐ
๐ viewWillAppear()
ใใ๐ ๋ทฐ๊ฐ ์์ฑ๋๊ธฐ ์ง์ ์ ์คํ๋๋ ๋ฉ์๋
ใใ๐ ๋ทฐ๊ฐ ๋ํ๋๊ธฐ ์ ์ ์คํํด์ผ ํ๋ ์์
์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
ใใใใ๐ ๋ทฐ ์
๋ฐ์ดํธ ์์
์ฒ๋ฆฌ ์
๐ viewDidAppear()
ใใ๐ ๋ทฐ๊ฐ ์์ฑ๋๊ณ ๋ ๋ค์ ์คํ๋๋ ๋ฉ์๋
ใใ๐ ๋ทฐ๊ฐ ๋ํ๋ ํ์ ์คํํด์ผ ํ๋ ์์
์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
ใใใใ๐ ์ ๋๋ฉ์ด์
์์
์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
ใใ๐ ViewWillAppear์ ๋ก์ง์ ๋ฃ์๋ค๊ฐ ๋ทฐ์ ๋ฐ์์ด ์๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ
๐ viewWillDisappear
ใใ๐ ๋ทฐ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ง์ ์ ์คํ๋๋ ๋ฉ์๋
๐ viewDidDisappear()
ใใ๐ ๋ทฐ๊ฐ ์ฌ๋ผ์ง๊ณ ๋ ๋ค์ ์คํ๋๋ ๋ฉ์๋
๐ navigationController.pushViewController()
๐ present(), modalPresentationStyle = .default
๐ present(), modalPresentationStyle = .fullScreen
๐ assign(unowned in swift)
ใใ๐ ๊ฐ์ฒด์ retain count๋ฅผ ์ฆ๊ฐ์ํค์ง X
ใใใใ๐ retain count
ใใใใใใ๐ ๊ฐ์ฒด ํ๋๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํด ์ฐธ์กฐ๋๊ฑฐ๋ ์์ ๋ ํ์๋ฅผ ์๋ฏธ
ใใใใใใ๐ ARC๊ฐ ์๋ ์์ ์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ์
ใใใใใใ๐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ retain/release ํค์๋๋ฅผ ์ง์ ์ฌ์ฉํ์๊ณ , ์ด๋ฅผ MRC(Manual Retain Counting)๋ผ๊ณ ํจ
ใใใใใใใใ๐ retain
ใใใใใใใใใใ๐ ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ์ฆ๊ฐ ์ํด
ใใใใใใใใใใ๐ ์นด์ดํธ๋์ด ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ์ง ์์
ใใใใใใใใ๐ release
ใใใใใใใใใใ๐ ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ๊ฐ์ ์ํด
ใใใใใใใใใใ๐ ๊ฐ์ฒด๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๊ณ ์ถ์ ๋ ์ด ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ๊ฐ์ ์ํด
๐ weak(weak in swift)
ใใ๐ assign๊ณผ ๊ฑฐ์ ๋์ผํ์ง๋ง, assign์ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋์ด๋ ํฌ์ธํฐ ๊ฐ์ด ๋ณํ์ง ์๋ ๋ฐ๋ฉด, weak๋ ๊ฐ์ฒด๊ฐ ํด์ ๋๋ ์์ ์ ํฌ์ธํฐ ๊ฐ์ด nil์ด ๋จ
ใใ๐ assign์ ๋ฌธ์ ์ ์ ๊ฐ์ฒด๊ฐ ํด์ ๋์ด๋ ํฌ์ธํฐ ๊ฐ์ด ๋จ์์์ด ์ ๊ทผํ๋ ค๋ค ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด ์๊น
ใใ๐ Objective-C๋ ๊ธฐ๋ณธ์ ์ผ๋ก nil์ ์ ๊ทผํ ๋๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง X
๐ ๋ ๊ฐ์ง ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก์ ๋ํ ๊ฐํ ์ฐธ์กฐ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋ ์ํ
๐ Swift๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ์ฌ ARC(Automatic Reference Counting)๋ฅผ ์ฌ์ฉ
ใใ๐ ARC
ใใใใ๐ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค ํ ์์ญ์ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ์ญํ ์ ์ํ
ใใใใ๐ ์ปดํ์ผ ์ ์ฝ๋๋ฅผ ๋ถ์ํด์ ์๋์ผ๋ก retain, release ์ฝ๋๋ฅผ ์์ฑํด ์ค
ใใใใ๐ ์๋์ผ๋ก Reference Count๋ฅผ ๊ณ์ฐํ์ฌ Count๊ฐ 0์ด ๋๋ฉด, ์ฆ, ์ธ์คํด์ค๊ฐ ๋ ์ด์ ํ์์์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์
ใใใใใใ๐ Swift์์ ํด๋์ค ์ธ์คํด์ค, ํด๋ก์ ๋ฑ ์ฐธ์กฐ ํ์
์ ๊ฐ์ ๋ชจ๋ ์๋์ผ๋ก ํ์ ํ ๋น๋จ
ใใใใใใ๐ Swift๋ ARC๋ฅผ ํตํด ํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์์ผ๋ฉด ์๋์ผ๋ก ํด์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ free์ ๊ฐ์ด ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ์ง ์์๋ ๊ฒ
ใใใใใใ๐ ์๋์ผ๋ก RC๋ฅผ ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ ๋ํ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ๋์ด์ฃผ๋ ๊ฒ
ใใใใ๐ ex) let sodeul = Human(name: โSodeulโ, age: 26)
ใใใใใใ๐ ์ง์ญ ๋ณ์ sodeul์ ์คํ์ ํ ๋น๋๊ณ , ์ค์ ์ธ์คํด์ค๋ ํ์ ํ ๋น๋๋ฉฐ, sodeul์ ํ์ ํ ๋น๋ ์ธ์คํด์ค์ ์ฃผ์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋จ
ใใใใใใ๐ ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํ ๋, ํด๋น ์ธ์คํด์ค์ ๋ํ RC๊ฐ ์ฆ๊ฐํ๋ฉฐ, ํ์ ๊ฐ์ด ์ ์ฅ๋จ
ใใใใ๐ + ex) let clone = sodeul
ใใใใใใ๐ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๋ณ์์ ๋์
ํ ๋, ์ฐธ์กฐ์ ์ํด ์ธ์คํด์ค์ clone์ ์ฃผ์ ๊ฐ์ด ๋์
๋๋ฉฐ RC๊ฐ ์ฆ๊ฐํ๋ ๋ฐฉ์
๐ ์๋ก ๊ฐํ ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๋ ๊ฒฝ์ฐ, Reference Count๊ฐ 0์ด ๋ ์ ์์ด Memory๊ฐ ํด์ ๋์ง ์๋ ์ผ์ด ๋ฐ์
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ
ใใ๐ ๋ ๊ฐ์ฒด ์ค ํ๋์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋จ
ใใ๐ ๊ฐํ ์ฐธ์กฐ๋ฅผ ์ฝํ(weak) ์ฐธ์กฐ ํน์ ๋ฏธ์์ (unowned) ์ฐธ์กฐ๋ก ๋ณ๊ฒฝํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
ใใใใ๐ ์ฝํ ์ฐธ์กฐ(weak)
ใใใใใใ๐ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๋ Reference Count๋ฅผ ์ฆ๊ฐ์ํค์ง ์์
ใใใใใใ๐ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋น ํด์ ๋ ๊ฒฝ์ฐ, ์๋์ผ๋ก nil์ด ํ ๋น๋์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋จ
ใใใใใใใใ๐ ๊ณ์ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋ฉด์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ฉด nil๋ก ์๋ ์ด๊ธฐํ
ใใใใใใใใใใ๐ ์ฆ, ๋ฌด๋ถ๋ณํ ์ฌ์ฉ์ ๊ณง ๋ฐํ์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํด
ใใใใใใ๐ ์ต์
๋์ผ ๋ ์ฌ์ฉ
ใใใใ๐ ๋ฏธ์์ ์ฐธ์กฐ(unowned)
ใใใใใใ๐ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๋ Reference Count๋ฅผ ์ฆ๊ฐ์ํค์ง ์์
ใใใใใใ๐ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋น ํด์ ๋ ๋ nil๋ก ์ด๊ธฐํํ์ง ์์ผ๋ฉฐ, nil์ด ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์
ใใใใใใ๐ ๋ฐ๋ผ์, ์๋ฌ๋ฅผ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๋๋ก ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ
ใใใใใใ๐ ํน์, unowned๋ก ๊ฐ๋ฆฌํค๋ ์ธ์คํด์ค๊ฐ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ์ผ์ด ํ์คํ๊ฒ ๋ฐ์ํ์ง ์์ ๋ ์ฌ์ฉํ ๊ฒ
๐ Link
๐ Link
๐ ํด๋ก์ ๋ ํด๋์ค์ ์ธ์คํด์ค์ฒ๋ผ ์ฐธ์กฐ ํ์
๐ ํด๋์ค ์ธ์คํด์ค์ ํ๋กํผํฐ์ ํด๋ก์ ๋ฅผ ํ ๋นํ ๋ ํด๋ก์ ์ ์ฐธ์กฐ๋ฅผ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ์ ์์
๐ ํด๋ก์ ์ ๋ณธ๋ฌธ์ด ์ธ์คํด์ค๋ฅผ ์บก์ณ(capture)ํ ๋ ํด๋ก์ ๊ฐ self๋ฅผ ์บก์ณํ๊ฒ ๋๋ฉด์ ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ์ ์์
ใใ๐ ์บก์ณ
ใใใใ๐ ํด๋ก์ ์ ๋ณธ๋ฌธ์์ ์ธ์คํด์ค์ ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ
ใใ๐ ํด๋ก์ ๋ณธ๋ฌธ์ ์ ์ธ๋ถ์์ ์บก์ณ ๋ชฉ๋ก์ ์ ์ํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ
ใใ๐ ์ฝํ ์ฐธ์กฐ ํน์ ๋ฏธ์์ ์ฐธ์กฐ๋ก ์ ์ธํ์ฌ ์ ์
ใใใใ๐ ์บก์ณ ๋ชฉ๋ก
ใใใใใใ๐ ํด๋ก์ ๋ณธ๋ฌธ์์ ํ๋ ์ด์์ ์ฐธ์กฐ ํ์
์ ์ด๋ค ์ฐธ์กฐ๋ก ์บก์ณํ ์ง๋ฅผ ์ ์ํ๋ ๋ฆฌ์คํธ
ใใใใใใ๐ ๋๊ดํธ([]) ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์
๐ GC ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ Garbage Collector๊ฐ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋์ ์ผ๋ก ๊ฐ์ํ๊ณ ์๋ค๊ฐ, ๋ ์ด์ ํ์๊ฐ ์๋ค๊ณ ์ฌ๊ฒจ์ง๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ญ์ ํ๋ ๋ฐฉ์
ใใ๐ ์ฆ, ํค ํฌ์ธํธ๋ ๋ฐํ์์ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ๋ค๋ ๊ฒ
๐ ARC ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ ๋์ ์ผ๋ก ๊ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ, ์ฝ๋๋ฅผ ๋น๋ํ ๋ ์ปดํ์ผ๋ฌ๊ฐ ํ๋ก๊ทธ๋๋จธ ๋์ release ์ฝ๋๋ฅผ ์ ์ ํ ์์น์ ๋ฃ์ด์ฃผ๋ ๊ฐ๋
ใใ๐ ์ฆ, ํค ํฌ์ธํธ๋ ์ปดํ์ผ ํ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ
๐ ๋ฐ ํ์, ์ปดํ์ผ ํ์์ ์ฐจ์ด์์ ๋ฐ์ํ๋ ๋ ๋ค๋ฅธ ์ฐจ์ด
ใใ๐ GC ๋ฐฉ์์ ํญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ๊ฐ์ํด์ผํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ ์์ฒด ์ธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ ๋์ด๋ ์ ๋ฐ์ ์์
ใใ๐ ๋ํ, ์ง์์ ์ธ ๊ฐ์๋ฅผ ์ํด CPU๋ฅผ ์ผ๋ถ ์ฌ์ฉํด์ผ๋ง ํจ
ใใ๐ ์ด์ ๋นํด, ARC ๋ฐฉ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๊ธฐ์ ์ด๋ฐ ์ค๋ฒํค๋์์ ์์ ๋ก์
ใใ๐ ์ด๋, ๋ฉ๋ชจ๋ฆฌ์ CPU๊ฐ ๋ฐ์คํฌํ์ ๋นํด ์ ํ์ ์ธ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ํนํ ๋ ์ค์ํ ๋ฌธ์ ์ด๊ณ ๊ทธ๋งํผ ์ฑ๋ฅ ์ธก๋ฉด์์ ์ด๋
๐ฅ ์ผ๋ฐ์ ์ผ๋ก ์ํ ์ฐธ์กฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง๋ ์ด์ ๋ ๊ฐ์ฒด๋ผ๋ฆฌ ์๋ก ์ฐธ์กฐํ๋๋ฐ ๊ฐ ๊ฐ์ฒด๋ก ์ ๊ทผํ๋ ์ธ๋ถ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ ธ ์ด ์ํ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ ์ ์๊ธฐ์ ๋ฐ์ํ๋๋ฐ, GC๋ GC root๋ก๋ถํฐ reachableํ ๊ฐ์ฒด๋ค์ ์ด๋ ค๋๊ณ ๋๋จธ์ง๋ ๋ชจ๋ ํด์ ํ๋ ๋ฐฉ์์ด๊ธฐ์, unreachableํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํด๋ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ
๐ macOS์์ ๊ตฌ๋๋๋ Application์ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํตํฉ ํ๋ ์์ํฌ
๐ iOS, iPadOS ๋ฑ์์ ๊ตฌ๋๋๋ Application์ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํตํฉ ํ๋ ์์ํฌ
๐ ๊ธฐ๋ณธ ์๋ฃํ, ์ฝ๋ ์ ๋ฐ ๋ฐ์ดํฐ ์ ์ฅ ๋ฑ ์ฑ์ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ
๐ iOS ์ฑ์ ๋ง๋ค๊ณ , UI๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์์ ์ธ ํ๋ ์์ํฌ
๐ UI ์์
์ Main Thread ํน์ Dispatch Main Queue์์๋ง ๋์ํด์ผ ํจ
ใใ๐ ์๋ํ๋ฉด, UIKit๋ Thread-safe ํ์ง ์๊ฒ ์ค๊ณ๋์ง ์์๊ธฐ ๋๋ฌธ
ใใใใ๐ UIKit๊ณผ ๊ฐ์ ๋งค์ฐ ํฐ ํ๋ ์์ํฌ์ ๋ชจ๋ ์์ฑ์ Thread-safe ํ๊ฒ ์ค๊ณํ๋ ๊ฒ์ ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๋ฉฐ, ๋๋ ค์ง๊ณผ ๊ฐ์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์
ใใ๐ ๊ฒฐ๋ก ์ ์ผ๋ก, ์ ํ์์ ๊ทธ๋ ๊ฒ ์ค๊ณํ์๊ธฐ ๋๋ฌธ์ Main Thread ํน์ Main Queue์์๋ง ๋์ํด์ผ ํจ
ใใ๐ฅ Main Run Loop๊ฐ ๋ทฐ์ ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๋ View Drawing Cycle์ ํตํด ๋ทฐ๋ฅผ ๋์์ ์
๋ฐ์ดํธ๋ฅผ ํ๋ ๋งค์ปค๋์ฆ์ผ๋ก ์ค๊ณํ์ฌ ๋์ํ๊ณ ์๋๋ฐ, Main Thread๊ฐ ์๋ Background Thread๊ฐ ๊ฐ์์ Run Loop๋ก ๊ทธ๋ฐ ๋์์ ํ๊ฒ ๋์์๋, ๋ทฐ๊ฐ ์๊ธฐ ๋ฉ๋๋ก ๋์ํ ์ ์์
๐ Thread-Safeํ DispatchQueue๋ฅผ ํตํด Multi-Threading์ ์ง์ํ๋ ๊ธฐ์
ใใ๐ ๋คํธ์ํน ๋ฑ ๋ฌด๊ฑฐ์ด ์์
์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ์ํค๋ฉด ์ฑ์ด ๋ง์ด ๋๋ ค์ง ์ ์์
ใใ๐ ์ฆ, ๋ฌด๊ฑฐ์ด ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ๋งก๊ธฐ๊ณ ๋ฉ์ธ ์ค๋ ๋์์๋ UI ๊ด๋ จ ์์
๋ง์ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ์ด ์ฑ์ ํจ์จ์
๐ DispatchQueue์ ์์
์ ์ถ๊ฐํ๋ฉด GCD๋ ์์
์ ๋ง๋ ์ค๋ ๋๋ฅผ ์๋์ผ๋ก ์์ฑ ๋ฐ ์คํํ๊ณ , ์์
์ด ์ข
๋ฃ๋๋ฉด ์ค๋ ๋๋ฅผ ์ ๊ฑฐํจ
๐ DispatchQueue
ใใ๐ ์์
ํญ๋ชฉ์ ์คํ์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด
๐ ๋ฉ์ธ ์ค๋ ๋์์ DispatchQueue๋ก ์์
์ ์ถ๊ฐํ๋ 2๊ฐ์ง ๋ฐฉ์
ใใ๐ sync
ใใใใ๐ ํ์ ์์
์ ์ถ๊ฐํ๊ณ ์์
์ด ์ข
๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๋ค์ ์์
์คํ
ใใ๐ async
ใใใใ๐ ํ์ ์์
์ ์ถ๊ฐํ๊ณ ์ฆ์ ๋ค์ ์์
์คํ
ใใ๐ ์ฆ, ์์
์ ๋ณด๋ด๋ ์์ ์์ ๋ณด๋ธ ์์
์ด ๋๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆด์ง ํน์ ๋ง์ง์ ๋ํด ๋ค๋ฃจ๋ ๊ฒ
๐ ํ์ ํน์ฑ 2๊ฐ์ง
ใใ๐ Serial Queue
ใใใใ๐ ํ๋์ ์ค๋ ๋๋ก๋ง ์์
์ ๋ถ๋ฐฐํ๋ ํ
ใใใใ๐ ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ์์
์ ์คํํ์ฌ ์์
์์ ์์ธก ๊ฐ๋ฅ
ใใ๐ Concurrent Queue
ใใใใ๐ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ก ์์
์ ๋ถ๋ฐฐํ๋ ํ
ใใใใ๐ ๋์์ ์ผ๋ก ์ฌ๋ฌ ์์
์ ์คํํ์ฌ ์์
์ด ๋๋๋ ์์๋ฅผ ์ ์ ์์
๐ ์ค์ DispatchQueue์ ์ข
๋ฅ 3๊ฐ์ง
ใใ๐ MainQueue
ใใใใ๐ ์ค์ง ํ๋๋ง ์กด์ฌ
ใใใใ๐ Serial ํน์ฑ์ ๊ฐ์ง
ใใใใ๐ ์ด๊ณณ์ ํ ๋น๋ ์์
์ ๋ฉ์ธ ์ค๋ ๋์์ ์ฒ๋ฆฌ
ใใใใใใ๐ UI ๊ด๋ จ ์์
ใใใใ๐ฅ ์ฝ๋ ์์ฑ ์ ๋ณ๋์ ์ฒ๋ฆฌ๊ฐ ์์ผ๋ฉด ๋ชจ๋ ์์
์ ๋ฉ์ธ ์ค๋ ๋์์ ์ผ์ด๋จ
ใใใใใใ๐ฅ ๋ชจ๋ ์์
๋ค์ด ๋ฉ์ธ ํ์ ํ ๋น๋๋ ๊ฒ๊ณผ ๋์ผํ ์๋ฏธ
ใใ๐ GlobalQueue
ใใใใ๐ Concurrent ํน์ฑ์ ๊ฐ์ง
ใใใใ๐ QoS(Quality Of Service)๋ฅผ ํตํด ์์
์ ์ค์๋๋ฅผ ๊ฒฐ์ ํ ์ ์์
ใใใใใใ๐ userInteractive : ์ฌ์ฉ์์ ์ง์ ์ํธ์์ฉํ๋ ์์
// UI ์
๋ฐ์ดํธ, ์ ๋๋ฉ์ด์
ใใใใใใใใ๐ ์ฌ์ฉ์ ์ก์
์ ๋ํ ์ฆ๊ฐ์ ์ธ ๋ฐ์์ด ๊ธฐ๋๋์ง๋ง, ์ด๋ฅผ ๋ฉ์ธ ์ค๋ ๋์์ ์ฒ๋ฆฌํ๋ฉด ๋ง์ ๋ก๋๊ฐ ๊ฑธ๋ฆฌ๋ ์์
๋ค์ userIneractive์์ ์ฒ๋ฆฌํ์ฌ ๋ฐ๋ก ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํจ
ใใใใใใ๐ userInitiated : ํด๋ฆญํ ๋ ์์
์ ์ํํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ฆ๊ฐ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ํ์ํ ์์
// ์ ์ฅ๋ ๋ฌธ์ ์ด๊ธฐ
ใใใใใใใใ๐ But, userIneractive๋ณด๋ค ์กฐ๊ธ ์ค๋๊ฑธ๋ฆด ์ ์๊ณ ์ ์ ๊ฐ ์ด๋ฅผ ์ด๋์ ๋ ์ธ์งํ๊ณ ์์
ใใใใใใ๐ default : ์ผ๋ฐ์ ์ธ ์์
ใใใใใใ๐ utility : ๋ณดํต progress bar์ ํจ๊ป ๊ธธ๊ฒ ์คํ๋๋ ์์
// ๋ฐ์ดํฐ ๋ค์ด๋ก๋
ใใใใใใ๐ background : ์ ์ ๊ฐ ์ง์ ์ ์ผ๋ก ์ธ์งํ์ง ์๋ ์๊ฐ์ด ๋ ์ค์ํ ์์
// ๋๊ธฐํ ๋ฐ ๋ฐฑ์
ใใใใใใ๐ unspecified : QoS ์ ๋ณด๊ฐ ์์์ ๋ํ๋ // ๊ฑฐ์ ์ฌ์ฉ X
ใใ๐ CustomQueue
ใใใใ๐ ๊ธฐ๋ณธ์ ์ผ๋ก Serialํ ํน์ฑ์ ๊ฐ๊ณ ์์ง๋ง, Concurrent๋ก ์ค์ ๊ฐ๋ฅ
ใใใใ๐ Qos ์ค์ ๊ฐ๋ฅ
๐ ์ ์ฝ ์กฐ๊ฑด(Constraints)์ ๋ฐ๋ผ ๋ทฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๋์ ์ผ๋ก ์ง์ ํ๋ ๊ฒ
ใใ๐ ์ ์ฝ ์กฐ๊ฑด
ใใใใ๐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์๋์ ์ธ ์ ์ฝ์ ์ฃผ๋ ๊ฒ
๐ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ์คํ ๋ ์ด์์์ ์์ฑํ๋ ์ด์
ใใ๐ Storyboard ๋ฐฉ์์ Build ์๊ฐ์ ์
์ํฅ์ ๋ฏธ์นจ
ใใ๐ XCode ์์ฒด ์ค๋ฅ๋ก ์ธํด Storyboard ๋ด View Controller๊ฐ Inspector ์์ ์ ๋๋ก ๋ณด์ด์ง ์์ ์ ์์
๐ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ์คํ ๋ ์ด์์์ ์์ฑํ๋ ๋ํ ๋ฐฉ๋ฒ
ใใ๐ SnapKit
ใใใใ๐ iOS์์ ์คํ ๋ ์ด์์์ ์คํ ๋ฆฌ ๋ณด๋ ์์ด, ์ฝ๊ณ ๊ฐ๋ตํ๊ฒ ์ค์ ํด์ค ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ใใใใ๐ snp.makeConstraint๋ฅผ ์ด์ฉํ์ฌ ์คํ ๋ ์ด์์์ ์ค์
๐ ์ฝ๋๋ก UI๋ฅผ ์์ฑ ์
ใใ๐ (private) lazy var
ใใใใ๐ ํญ์ ํ์ํ์ง ์์ ์ธ์คํด์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ
ใใ๐ (private) let
ใใใใ๐ ํญ์ ๋ณด์ฌ์ง๊ฒ ๋๋ ์ธ์คํด์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ์ง๋ง, ๋๋๋ก lazy var๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข์
ใใใใใใ๐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ์ฐ๊ด์ฑ (ํ์ํ์ง ์์๋ฐ let์ผ๋ก ์ ์ธํ๋ ๊ฒฝ์ฐ, ์ด๋ ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ด๋ฏ๋ก)
๐ ์๊ฐ์ ์ผ๋ก ๋ทฐ๋ฅผ ํ์ธํ ์ ์์ด ์คํ ๋ ์ด์์์ด๋ ๋ทฐ์ ๊ตฌ์ฑ์ ์ฝ๊ฒ ํ์ธํ๊ณ ์์ ํ ์ ์์
๐ But, ๋ทฐ์ ์ฌ์ฌ์ฉ์ด ์ด๋ ต๊ณ ํ๋ฉด์ด ๋ง์์ง๋ฉด ํ๋ก์ ํธ๋ฅผ ๋ก๋ํ๋ ์๋๊ฐ ๋๋ ค์ง
๐ And, ํ์
์ ์ฌ๋ฌ ์ฌ๋์ด ์คํ ๋ฆฌ๋ณด๋๋ฅผ ์์ ํ๊ฒ ๋๋ฉด ์ฝ๊ฒ ์ถฉ๋์ด ๋ฐ์ํจ
๐ offset
ใใ๐ ์ฃผ๋ก, element ์์ ๊ฐ๊ฒฉ์ ์ฌ์ฉ
ใใ๐ ํ์ฌ ๋ทฐ constraint = ์ํผ๋ทฐ constraint + offset ๊ฐ, ๋ณดํต bottom๊ณผ right๋ ๋ง์ด๋์ค ๋ถํธ๋ฅผ ๊ฐ๊ฒ ๋จ
๐ inset
ใใ๐ ์ฃผ๋ก, superView ์์ ๊ฐ๊ฒฉ์ ์ฌ์ฉ
ใใ๐ inset์ ๊ฒฝ์ฐ์๋ UIEdgeInsets์ ์ฃผ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๊ธฐ์, bottom๊ณผ right๊ฐ ์์ ๊ฐ์ด ์๋๋ผ ์์ ๊ฐ์์ ์ ์
๐ ์๋จ์ ๋
ธ์น or ๋ค๋น๊ฒ์ด์
๋ฐ๋ ํ๋จ์ ํ๋ฐ or ํญ๋ฐ์ ๊ฐ์ ์ด๋ฐ ์์คํ
์ ์ํด ๊ฐ๋ ค์ง์ง ์๊ณ ๋ณด์ฌ์ง๊ฒ ๋๋ ์์ญ
๐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ์ด ์ด ์์ญ๋ค์ ์นจ๋ฒํ์ง ๋ชปํ๋๋ก SafeArea๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ ๋ ์ด์์์ ์ค์
๐ Left(Right)
ใใ๐ ์ข์ธก ๋ฐ ์ฐ์ธก์ ์ ์ฝ
๐ Leading(Trailing)
ใใ๐ Text ์์ ๋ฐ ์ข
๋ฃ ์ง์ ์ ์ ์ฝ
ใใ๐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์ข์ธก์์ ์ฐ์ธก์ผ๋ก ๋ฌธ์๊ฐ ํํ๋จ
ใใ๐ ์๋๊ถ์ ๊ฒฝ์ฐ, ์ฐ์ธก์์ ์ข์ธก์ผ๋ก ๋ฌธ์๊ฐ ํํ๋จ
๐ (Content) Hugging
ใใ๐ ์ต๋ ํฌ๊ธฐ ์ ํ ๊ด๋ จ ์์ฑ
ใใ๐ hugging์ ์ฐ์ ์์๊ฐ ๋์์๋ก ์์ ์ ํฌ๊ธฐ๋ฅผ ์ ์งํ๊ณ ์์์๋ก ํฌ๊ธฐ๊ฐ ๋์ด๋๊ฒ ๋จ
๐ (Compression) Resistance
ใใ๐ ์ต์ ํฌ๊ธฐ ์ ํ ๊ด๋ จ ์์ฑ
ใใ๐ resistance์ ์ฐ์ ์์๊ฐ ๋์์๋ก ์์ ์ ํฌ๊ธฐ๋ฅผ ์ ์งํ๊ณ ์์์๋ก ํฌ๊ธฐ๊ฐ ์์์ง๊ฒ ๋จ
๐ Xib ํ์ผ์ ๋ง๋ค๊ณ UIView๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ์์ฑํด ๋์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
๐ UIView๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ฝ๋๋ก ์ ์ํด ๋ด๋ถ์์ ๋ ์ด์์๊น์ง ์ค์ ํ๋ ๋ฐฉ๋ฒ
๐ Autoresizing mask๋ SuperView์ ํ๋ ์์ด ๋ณ๊ฒฝ๋ ๋, SubView์ ํ๋ ์์ด ๋ณ๊ฒฝ๋๋ ๋ฐฉ์
๐ Frame
ใใ๐ ์ํผ๋ทฐ์ ์ขํ ์์คํ
์์ ๋ทฐ์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ํ๋
ใใ๐ Frame์ origin์ ์ํผ๋ทฐ์ ์์ ์์ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋๊ฐ๋ฅผ ๋ํ๋
ใใ๐ Frame์ origin์ ๋ณ๊ฒฝํ๋ฉด ์์ ์ ์์น๊ฐ ์ด๋
ใใ๐ Frame์ size๋ ์ํผ๋ทฐ์์ ์ฐจ์งํ๊ณ ์๋ ํฌ๊ธฐ๋ฅผ ๋ํ๋
ใใใใ๐ ํ์ ๋ ์ฌ๊ฐํ์ ์๊ฐ
๐ Bounds
ใใ๐ ์์ ์ ์ขํ ์์คํ
์์ ๋ทฐ์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ํ๋
ใใ๐ Bounds์ origin์ ํญ์ (0, 0)์
ใใ๐ Bounds์ origin์ ๋ณ๊ฒฝํ๋ฉด viewport๊ฐ ์ด๋ํ๊ธฐ ๋๋ฌธ์ ์๋ธ๋ทฐ๋ค์ด ์ด๋ํ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๊ฒ ๋จ
ใใใใ๐ ๋ง์ฝ, ์ผ์ชฝ์ผ๋ก ์ค์์ดํํด์ ์คํฌ๋กคํ๋ฉด bounds์ x์ขํ๊ฐ ์ฆ๊ฐํจ
ใใใใ๐ ์คํฌ๋กค ๋ทฐ๋ ์คํฌ๋กค ๋ ๋๋ง๋ค ์คํฌ๋กค ๋ทฐ์ Bounds๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฉ์
ใใ๐ Bounds์ size๋ ์์ ์์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋
๐ ์ด๋ฌํ ์ฐจ์ด๋ก, Frame์ ๋ทฐ์ ์์น ๋ฐ ํฌ๊ธฐ๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉ, Bounds๋ ๋ทฐ์ ์ค์ ํฌ๊ธฐ๋ฅผ ์๊ณ ์ถ์ ๋ ์ฌ์ฉํจ
๐ ๊ฐ์ฒด๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ๋
๐ Delegate
ใใ๐ ํน์ ๊ฐ์ฒด์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๋ฌํ ์ ์๊ฒ ํด์ฃผ๋ iOS ๋์์ธ ํจํด
ใใ๐ ํ๋กํ ์ฝ์ ์ ์ํ๊ณ ๋์ ์ฒ๋ฆฌํ ๊ฐ์ฒด์์ ์ด๋ฅผ ์ฑํํ๊ณ ๊ตฌํํ๋ ๋ฐฉ์
ใใ๐ ๊ฐ์ฒด ๊ฐ์ ์ฐธ์กฐ ํ์
์ ์ฃผ๊ณ ๋ฐ๋ Delegate์ ๋ฐ๋ก ์ฒ๋ฆฌ๊ฐ ์๋ค๋ฉด retain ํ์์ด ์ผ์ด๋ ์ ์์ด weak๋ก ์ ์ธํ์ฌ retain์ ๋ฐฉ์งํด์ผ ํจ
ใใใใ๐ retain : ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์
ใใ๐ ์ฃผ๋ก ์ด๋ฒคํธ๋ฅผ 1:1๋ก ์ ๋ฌํ ๋ ๋ง์ด ์ฌ์ฉ
ใใ๐ ์ 3์ ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ์ง X, ํ์คํ ์ฒ๋ฆฌ ๊ฐ๋ฅ
ใใ๐ ๋ง์ ์์ ์ฝ๋ ํ์, ๋ค์์ ๊ฐ์ฒด์๊ฒ ์ด๋ฒคํธ๋ฅผ ์๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋นํจ์จ์
๐ NotificationCenter
ใใ๐ ์ฑ ๋ด์์ ์๋ฌด๋ฐ์๋ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ฉด ์ฑ ๋ด์์ ์๋ฌด๋ฐ์๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ
ใใ๐ ์ฑ๊ธํค ๊ฐ์ฒด์ธ NotificationCenter๋ฅผ ํตํด ์ด๋ฒคํธ ๋ฐ์ ๋ด์ฉ์ addObserverํ ๊ฐ์ฒด๋ค์๊ฒ postํ๋ ๋ฐฉ์
ใใ๐ ์ฃผ๋ก ์ด๋ฒคํธ๋ฅผ 1:N๋ก ์ ๋ฌํ ๋ ์ฉ์ด
ใใ๐ Delegate ๋ณด๋ค ์ ์ ์์ ์ฝ๋ ํ์, ๋ค์์ ๊ฐ์ฒด์๊ฒ ์ด๋ฒคํธ๋ฅผ ์๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ ํจ์จ์
ใใ๐ ์ 3์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋์ ํ์๋ก ํจ, ํ์คํ๊ฒ ์ฒ๋ฆฌ ๋์๋์ง ์๊ธฐ ์ด๋ ค์
๐ DataSource
ใใ๐ Data๋ฅผ ๋ฐ์ View๋ฅผ ๊ทธ๋ฆฌ๋ ์ญํ ์ ํจ
ใใ๐ ๋ํ ๊ด๋ จ func : cellForRowAt, numberOfRowsInSection
๐ Delegate
ใใ๐ ๋์์ ๋ด๋นํ๋ ์ญํ ์ ํจ
ใใ๐ ๋ํ ๊ด๋ จ func : didSelectRowAt
๐ numberOfRowsInSection(numberOfItemsInSection)
ใใ๐ ์น์
๋ง๋ค ํ์ํ ์
์ ๊ฐ์๋ฅผ ๋ฐํ
๐ cellForRowAt(cellForItemAt)
ใใ๐ ์ด๋ค ์
์ ์ฌ์ฉํ ์ง ๋ฐํ
๐ code)
func tableView(UITableView, numberOfRowsInSection: Int)
func tableView(UITableView, cellForRowAt: IndexPath)
๐ ๊ฐ tableview์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํ
๐ code)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// indexPath : tablewView/collectionView์ ํ์ ์๋ณํ๋ ์ธ๋ฑ์ค ๊ฒฝ๋ก : [a, b] ํํ (a : section, b : row/item)
switch tableView {
case firstTableView:
let cell = firstTableView.dequeueReusableCell(withIdentifier: "firstCell") as! UITableViewCell
cell.textLabel?.text = data1[indexPath.row]
// indexPath.row : tableView ์น์
๋ด์ ๋ฅผ ์์น๋ฅผ ์๋ณํ๋ ์ธ๋ฑ์ค ๊ฒฝ๋ก
// + indexPath.item : collectionView ์น์
๋ด์ ์์น๋ฅผ ์๋ณํ๋ ์ธ๋ฑ์ค ๊ฒฝ๋ก
return cell
case secondTableView:
// ...
default:
return UITableViewCell()
}
}
๐ Cell์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ํํํ ์ ์๋ View
๐ TableView
ใใ๐ ๋จ์ผ ์ด์ ๋ฐฐ์ด๋ ํ์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ทฐ
ใใ๐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ง ์คํฌ๋กค ๋ง์ด ๊ฐ๋ฅ
ใใ๐ ๊ฐ๋จํ ๋ชฉ๋ก์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํํํ ๋ ์ฌ์ฉํ ๋ ์ ์ฉ
๐ CollectionView
ใใ๐ ์ปค์คํ
๊ฐ๋ฅํ ๋ ์ด์์์ ์ฌ์ฉํด ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ํ์ํ๋ ๋ทฐ
ใใ๐ ํ
์ด๋ธ๋ทฐ์์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๋ถ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ ์ฌ๋ฌ ์ด๊ณผ ํ์ ๊ฐ์ง ์ ์๊ณ ์์ง/์ํ ์คํฌ๋กค์ด ๋ชจ๋ ๊ฐ๋ฅ
ใใ๐ ๋ฐ์ดํฐ ํํ ๋ฐฉ์์ ๋ค์ํ ๋ชจ์ต์ผ๋ก ์ปค์คํฐ๋ง์ด์งํ ๋ ์ฌ์ฉํ ๋ ์ ์ฉ
ใใ๐ cell์ ์์น์ ๋ฐฐ์ด์ ์ํ๋ ๋๋ก ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค๋ ์ฅ์
๐ TableView, CollectionView์ ์
์ ์์ฑํ ๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ํ์ฌ dequeueReusableCell(withIdentifier:) ๋ฉ์๋๋ฅผ ํตํด ์
์ ์ฌ์ฌ์ฉํจ
๐ dequeueReusableCell(withIdentifier:) ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ์ง์ ์ prepareForReuse() ๋ฉ์๋๊ฐ ์คํ๋จ
๐ ์
์ ์ฌ์ฌ์ฉ ํ๋ฉด ์ด์ ์ ์ค์ ํ ์์ฑ์ด ๊ทธ๋๋ก ๋จ์์๊ฒ ๋๋๋ฐ, prepareForReuse()๋ฅผ ํตํด ์ด์ ์ ์์ฑ์ ์ด๊ธฐํํ ์ ์์
๐ ๊ฐ ์น์
์ item, Header, Footer์ ๊ฐ์ ๊ฒ๋ค์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์
๐ ๋ํ ๊ด๋ จ func : sizeForItemAt, insetForSectionAt
๐ setNeedsDisplay()
ใใ๐ ๋ทฐ์ ์ปจํ
์ธ ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ณ ์ถ์ ๋ ํธ์ถํ๋ ๋ฉ์๋
ใใ๐ View๊ฐ ์
๋ฐ์ดํธ๋์ด์ผ ํจ์ ๋ช
์์ ์ผ๋ก ์์คํ
์ ์๋ฆฌ๋ ๋ฉ์๋
ใใ๐ ๋ฐ๋ก ๋ค์ ๊ทธ๋ ค์ง์ง ์๊ณ ๋ค์ ์
๋ฐ์ดํธ ์ฃผ๊ธฐ๊ฐ ๋๊ณ draw() ๋ฉ์๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋ ๋ ์
๋ฐ์ดํธ๋จ
๐ setNeedsLayout()
ใใ๐ ๋ทฐ์ ํ์ ๋ทฐ๋ค์ ๋ ์ด์์์ ์กฐ์ ํ๊ณ ์ถ์ ๋ ํธ์ถํ๋ ๋ฉ์๋
ใใ๐ ๋ ์ด์์์ด ์
๋ฐ์ดํธ๋์ด์ผ ํจ์ ๋ช
์์ ์ผ๋ก ์์คํ
์ ์๋ฆฌ๋ ๋ฉ์๋
ใใ๐ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ทฐ๋ ์ฌ๊ณ์ฐ์ด ํ์ํ ๋ทฐ๋ผ๊ณ ์์คํ
์๊ฒ ์๋ ค, ์ดํ update cycle์์ layoutSubviews() ๋ฉ์๋๊ฐ ํธ์ถ๋จ
ใใใใ๐ layoutSubview()
ใใใใใใ๐ UIView์ ์ธ์คํด์ค ๋ฉ์๋
ใใใใใใ๐ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ํด๋น ๋ทฐ์ ํ์ ๋ทฐ๋ค์ด ๋ชจ๋ ์ฐ๋ฌ์ ํธ์ถ๋จ
ใใใใใใ๐ ์ด ๋ฉ์๋๋ View์ ๊ฐ์ด ์ฌ๊ณ์ฐ๋์ด์ผ ํ๋ ์ ์ ํ ์์ ์ ์์คํ
์ ์ํด ์๋์ผ๋ก ํธ์ถ๋จ
๐ displayIfNeeded()
ใใ๐ ํ์ฌ ์
๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒ์ผ๋ก ํ์๋ ๊ฒฝ์ฐ, layer์ ์
๋ฐ์ดํธ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ๋ฉ์๋
๐ layoutIfNeeded()
ใใ๐ ์ฆ์ ๋ ์ด์์์ ์
๋ฐ์ดํธ๋ฅผ ์งํํ๋ ๋ฉ์๋
๐ CollectionView ํน์ TableView์ ๋ชจ๋ data๋ฅผ reload ํ๋ ๋ฉ์๋
๐ CollectionView ํน์ TableView๋ฅผ ํ ๋ฒ์ ์ฒ์๋ถํฐ ๋ค์ ๊ทธ๋ฆฌ๋ฏ๋ก, ๊ฐ๋จํ๊ฒ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ๊ทธ๋งํผ ๋น์ฉ์ด ํฌ๋ค๋ ๋จ์ ์ด ์์
ใใ๐ ์ผ๋ถ ์
๋ฐ์ดํธ ์์๋ reloadRows(at:with:)์ด๋ performBatchUpdates(_:completion)์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์
๐ ํด๋น ๋ทฐ์ ์์ ๋ทฐ์ ์ฐ๊ฒฐ์ ํด์ ํ๋ ๋ฉ์๋
๐ ๋ฉ์์ง์ ํจ๊ป ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉฐ, ์คํ์ ์ข ๋ฃ์ํค๋ ๋ฉ์๋
๐ UILabel
ใใ๐ ๋จ์ํ ํ
์คํธ๋ฅผ ํ์ํด์ฃผ๋ UI
๐ UISlider
ใใ๐ ๋๋๊ทธ(์ฌ๋ผ์ด๋)๋ฅผ ์ง์ํ๋ UI
๐ UIActivityIndicatorView
ใใ๐ ์์ ํํ๋ก ๋น๊ธ๋น๊ธ ๋์๊ฐ๋ UI (๋ก๋ฉ)
๐ UITextField
ใใ๐ ํ
์คํธ๋ฅผ ํธ์งํ๊ธฐ ์ํ ๊ฐ์ฒด
ใใ๐ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋ฉด ํค๋ณด๋๊ฐ ๋ฑ์ฅํ๋ฉฐ ํ
์คํธ๋ฅผ ์
๋ ฅ ๋ฐ ์์ ํ ์ ์์
ใใ๐ ์ฌ๋ฌ ์ค์ ์ฌ์ฉํ ์ ์๊ณ ํ ์ค๋ก๋ง ์์ฑ์ด ๊ฐ๋ฅ
๐ UITextView
ใใ๐ ํ
์คํธ๋ฅผ ์ฌ๋ฌ ์ค๋ก ์ฌ์ฉํ๊ณ , ํธ์งํ๊ธฐ ์ํ ๊ฐ์ฒด
ใใ๐ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋ฉด ํค๋ณด๋๊ฐ ๋ฑ์ฅํ๋ฉฐ ํ
์คํธ๋ฅผ ์
๋ ฅ ๋ฐ ์์ ํ ์ ์์
ใใ๐ Editable ์์ฑ์ false๋ก ์ค์ ํ ๊ฒฝ์ฐ ํธ์ง์ด ๋ถ๊ฐ๋ฅ
ใใ๐ ํ
์คํธ๊ฐ ๊ธธ์ด์ง๋ฉด ์๋์ผ๋ก ์คํฌ๋กค ๊ธฐ๋ฅ์ ์ ๊ณต
๐ UIBarButtonItem
ใใ๐ ๋ค๋น๊ฒ์ด์
๋ฐ ๋ฒํผ ์์ดํ
๐ UIPageViewController
ใใ๐ ์ฌ๋ฌ ๊ฐ์ ๋ทฐ๋ฅผ ์์ผ๋ก ๋๊ธฐ๋ฉฐ ํ๋ฉด ์์ ์ถ๋ ฅํ ๋ ์ฌ์ฉํ๋ View Controller
๐ UIPageControl
ใใ๐ ํ์ฌ ํ์ด์ง ์์น๋ฅผ ํ์ํด์ฃผ๋ UI (Ooooo / oOooo ๊ฐ์ UI)
๐ UIActivityViewController
ใใ๐ ๋ด ์ฑ์์ ์ฌ์ฉํ๊ณ ์๋ ํ์ค ์๋น์ค๋ค์ ๋ค๋ฅธ ์ฑ๋ค์๊ฒ ์ ๊ณตํ ์ ์๊ฒ ํด์ฃผ๋ View Controller
ใใ๐ ex) ๊ณต์ ํ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์ถ๋ ฅ๋๋ UI
๐ UIScrollView
ใใ๐ ์๊ฐ๋ฝ์ ์์ง์์ ๋ฐ๋ผ ํ๋ฉด์ ์์น๊ฐ ๋ณํ๋ View, ํ๋ ๋ฐ ์ถ์๋ ๊ฐ๋ฅํจ
๐ UISearchController
ใใ๐ SearchBar์์ ์ํธ ์์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ ํ์๋ฅผ ๊ด๋ฆฌํ๋ View Controller
๐ UIRefreshControl
ใใ๐ TableView ํน์ CollectionView๋ฅผ ํฌํจํ ๋ชจ๋ UIScrollView์ ๋ถ์ผ ์ ์๋ ํ์ค ์ปจํธ๋กค
ใใ๐ ์คํฌ๋กค์ด ๊ฐ๋ฅํ ๋ทฐ์ ์ถ๊ฐํ์ฌ ์ปจํ
์ธ ๋ฅผ ์๋ก๊ณ ์นจํ ์ ์๋๋ก ํจ (์๋๋ก ์ก์ ๋น๊ธฐ๋ ๋ฐฉ์์ผ๋ก ์๋)
๐ UITableViewHeaderFooterView
ใใ๐ ์ปค์คํ
ํค๋ ๋๋ ํธํฐ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ
๐ ํค๋ณด๋์ ํ๋ enter ํค ๋ฒํผ์ ๋์์ ์ ์ฉํ๋ ์์ฑ
ใใ๐ ex) textView.returnKeyType = .done
๐ ํ๋ผ๋ฏธํฐ๋ก true๋ฅผ ์ ๋ฌํ ๊ฒฝ์ฐ ๋ทฐ์ First responder์ ์ํ๋ฅผ ๊ฐ์ ๋ก ํด์ ํ๋ค๋ ์๋ฏธ
๐ ๋ทฐ๋ ํ๋ฉด์ ํฐ์น๊ฐ ์ผ์ด๋ฌ์ ๋ ํธ์ถ๋๋ ๋ฉ์๋
๐ ๊ฐค๋ฌ๋ฆฌ์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ View Controller
ใใ๐ ๋ฐ๋์ ๊ถํ์ ์ค์ ํด์ผ ํจ // Info.plist; Privacy - Photo Library Usage Description
๐ code)
extension FeedViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// UINavigationControllerDelegate : ํ๋ฉด์ด ์ ํ๋ ๋์ ๋์์ ์ง์ํ๋ฉฐ, Image Picker์์ ์ฌ์ง์ ์ ํํ๊ฑฐ๋, ์ทจ์ํ์ ๋ ๋ค์ ์๋ ์ฌ์ฉ์ค์ด๋ ๋ทฐ๋ก ๋์์ค๋ ์์
์ ์ฒ๋ฆฌํจ
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
// UIImagePickerControllerDelegate(:didFinishPickingMediaWithInfo) : ์ฌ์ฉ์๊ฐ ์ ํํ ์ฌ์ง์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋
var selectImage: UIImage?
if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
selectImage = editedImage
} else if let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
selectImage = originalImage
}
picker.dismiss(animated: true) { [weak self] in
let uploadViewController = UploadViewController(uploadImage: selectImage ?? UIImage())
let navigationController = UINavigationController(rootViewController: uploadViewController)
navigationController.modalPresentationStyle = .fullScreen
// modalPresentationStyle: ๋ํ๋๋ ํํ (์ฌ์ด์ฆst)
// + modalTransitionStyle: ๋ํ๋๋ ํจ๊ณผ (์ ๋๋ฉ์ด์
st)
self?.present(navigationController, animated: true)
}
}
}
๐ UIImageView์ Image๋ฅผ ๋ฃ์ ๋ ์ด๋ค ๋น์จ๋ก ๋ฃ์์ง ์ ํ๋ ์์ฑ
๐ ๋ํ 3๊ฐ์ง ์์ฑ
ใใ๐ scaleAspectFit
ใใใใ๐ ์ฝํ
์ธ ์ ๋น์จ์ ์ ์งํ๋ฉด์ ๋ทฐ์ ์ฌ์ด์ฆ์ ๋ง๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋๋ฆฌ๋ ์ต์
์ผ๋ก, ๋จ๋ ์์ญ์ ํฌ๋ช
์ฒ๋ฆฌ
ใใ๐ scaleAspectFill
ใใใใ๐ ์ฝํ
์ธ ์ ๋น์จ์ ์ ์งํ๋ฉด์ ๋ทฐ์ ์ฌ์ด์ฆ์ ๋ง๊ฒ ์ด๋ฏธ์ง๋ฅผ ๊ฝ ์ฑ์ฐ๋ ์ต์
์ผ๋ก, ์ด๋ฏธ์ง์ ์ผ๋ถ ๋ถ๋ถ์ด ์๋ฆด ์ ์์
ใใ๐ scaleToFill
ใใใใ๐ ์ ์ฒด ์ด๋ฏธ์ง๊ฐ ๋ค ๋์ฌ ์ ์๋๋ก, ํ์ ์ ๋น์จ์ ๊นจํธ๋ฆฌ๋ฉด์ ๋ทฐ์ ์ฌ์ด์ฆ์ ๋ง๊ฒ ์ด๋ฏธ์ง๋ฅผ ๊ฝ ์ฑ์ฐ๋ ์ต์
๐ ์ฝ๋ ์์์ ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฅ
๐ ์ฑ์ ํธ์ฌ ์๋ฆผ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ๋
๐ ๊ธฐ๋ณธ์ ์ผ๋ก, ๊ฐ๋จํ๊ฒ ๋ง์ด ์ฌ์ฉํ๋ iOS์ ๋ํ์ ์ธ ์ ์ฅ ๊ธฐ๋ฅ
๐ ์ฑ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ตฌ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ
๐ key์ value ์์ผ๋ก ์ ์ฅ
๐ Singleton ํจํด์ผ๋ก ์ค๊ณ๋์ด ์ฑ ์ ์ฒด์์ ๋จ ํ๋์ ์ธ์คํด์ค๋ง ์กด์ฌํจ
๐ UserDefaults ๊ด๋ จํ์ฌ ๋ง์ด ๋ณผ ์ ์๋ ์ฝ๋
๐ UserDefaults์๋ PropertyList๋ง ์ ์ฅ๋์ด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์
๐ ๋ฐ๋ผ์, PropertyListEncoder, PropertyListDecoder ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ์ ์งํ
ใใ๐ ์ฌ๊ธฐ์, PropertyList๋ plist๋ฅผ ์๋ฏธ
๐ URLSession์ ๋คํธ์ํฌ ํต์ ์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ํ๋ ์์ํฌ์ ํด๋์ค
๐ ์ปค์คํฐ๋ง์ด์ง์ ํ ์ ์์ง๋ง ์ ํ๋ ๊ธฐ๋ฅ๋ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์
๐ URLSession์ HTTP ํต์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Request์ Response ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์
ใใ๐ Request์ ๋ ๊ฐ์ง ํํ
ใใใใ๐ URL ์ธ์คํด์ค๋ฅผ ํตํด ์ง์ ํต์ ํ๋ ํํ
ใใใใ๐ URLRequest ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ต์
์ ์ค์ ํ์ฌ ํต์ ํ๋ ํํ
ใใ๐ Response๋ ๋ ๊ฐ์ง ํํ
ใใใใ๐ ์ค์ ๋ Task์ Completion Handler ํํ
ใใใใ๐ URLSessionDelegate๋ฅผ ํตํด ์ง์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํํ
๐ฅ URLSession ์งํ ์์ (5๋จ๊ณ)
ใใ๐ 1. URLSessionConfiguration ๊ฒฐ์
ใใใใ๐ default
ใใใใใใ๐ ์ฟ ํค์ ๊ฐ์ ์ ์ฅ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ํต์ ์ ํ ๋ ์ฌ์ฉ
ใใใใ๐ emphemral
ใใใใใใ๐ ์ฟ ํค๋ ์บ์๋ฅผ ์ ์ฅํ์ง ์๋ ์ ์ฑ
์ ์ฌ์ฉํ ๋ ์ด์ฉ
ใใใใ๐ background
ใใใใใใ๐ ์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปจํ
์ธ ๋ฅผ ๋ค์ด๋ก๋/์
๋ก๋ ํ ๋ ์ฌ์ฉ
ใใ๐ 2. Session ์์ฑ
ใใใใ๐ ๊ณต์ ์ธ์
(์ฑ๊ธํค)
ใใใใใใ๐ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ ์ก๋ง์ ์ง์ํ๋ ์ธ์
ใใใใ๐ default ์ธ์
ใใใใใใ๐ ๊ธฐ๋ณธ์ ์ธ Session์ผ๋ก ๋์คํฌ ๊ธฐ๋ฐ ์บ์ฑ์ ์ง์
ใใใใ๐ emphemral ์ธ์
ใใใใใใ๐ ์ด๋ ํ ๋ฐ์ดํฐ๋ ์ ์ฅํ์ง ์๋ ํํ์ ์ธ์
ใใใใ๐ background ์ธ์
ใใใใใใ๐ ์ฑ์ด ์ข
๋ฃ๋ ์ดํ์๋ ํต์ ์ด ์ด๋ค์ง๋ ๊ฒ์ ์ง์ํ๋ ์ธ์
ใใ๐ 3. ์ฌ์ฉํ Task ๊ฒฐ์ ํ ์ ์ ํ Response ๋ฉ์๋ ์์ฑ
ใใใใ๐ URLSessionDataTask
ใใใใใใ๐ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
ใใใใใใ๐ NSData ํ์
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค๋ฐ๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ ์ ์ฅ์์๋ ์ ์ฅํ์ง ์์
ใใใใ๐ URLSessionUploadTask
ใใใใใใ๐ ํ์ผ์ ์
๋ก๋ํ ๋ ์ฌ์ฉ
ใใใใ๐ URLSessionDownloadTask
ใใใใใใ๐ ์ค์ ํ์ผ์ ๋ค์ด๋ฐ์ ์ ์ฌ์ฉ
ใใใใใใ๐ ๋ด๋ ค๋ฐ์ ํ์ผ์ temp ๋๋ ํ ๋ฆฌ์ ์ ์ฅ๋๋ฉฐ, ๋ฐ๋ผ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ธ์
์ ์ง์ํจ
ใใ๐ 4. Task ์คํ
ใใ๐ 5. Task ์๋ฃ ํ Response ๋ฉ์๋ ์คํ
๐ iOS, macOS๋ฅผ ์ํ Swift ๊ธฐ๋ฐ์ ๋คํธ์ํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ URLSession์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ, URLSession ๋ฐฉ์์ ๋นํด ์ฝ๊ฒ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ณ ์ฝ๋๋ฅผ ๊ฐ๋
์ฑ์ด ๋๊ฒ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅ
๐ Request & Response ํํ์ ๊ตฌ์กฐ๋ก ์ด๋ค์ง
ใใ๐ Request์ url๊ณผ method(get/post/delete/โฆ) ๋ฐ ํ๋ผ๋ฏธํฐ์ ํค๋ ๋ฑ์ ์ง์
ใใ๐ Response์ completion handler(@escaping) ์ฝ๋ ์์ฑ
๐ iOS์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐํธํ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ ๊ธฐ๊ธฐ์ ์์น, ๊ณ ๋, ๋ฐฉํฅ ๋ฑ์ ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ํ๋ ์์ํฌ
๐ CLLocationManager ํด๋์ค ๊ฐ์ฒด๋ฅผ ํ์ฉํ์ฌ CoreLocation ์๋น์ค๋ฅผ ๊ตฌ์ฑํ๊ณ , ์์ํ๊ณ ์ค์งํ ์ ์์ผ๋ฉฐ, ๊ถํ์ ๋ฐ๋์ ๋ฐ์์ผ ํจ
๐ ์ ํ ๋งต์ ์ด๋, ํ๋ ๋ฐ ์ถ์ ๋ฑ ์ง๋์ ๊ดํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ
๐ ๋ ์ง ํน์ ๋ฌธ์์ด์ ๋ณํํด์ฃผ๋ ์ญํ
๐ ๋ ์ง ํ์์ ๋ฌธ์์ด์ Date ํ์
์ผ๋ก ํน์ Date ํ์
์ ๋ ์ง ํ์์ ๋ฌธ์์ด๋ก ๋ณํํ ๋ ์ฌ์ฉํ๋ ํด๋์ค
๐ Why Test?
ใใ๐ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๊ฐ ๋ฌธ์ ์์ด ์๋ํ๋๋ก ์ ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ํจ
๐ XCTest
ใใ๐ ์ ํ์์ ์ ๊ณตํ๋ Test ํ๋ ์์ํฌ
๐ Unit Test
ใใ๐ ํน์ ํจ์์ ๋์์ด ๋ฌธ์ ์์ด ์๋ํ๋๋ก ์ ๋์ํ๋์ง ํ์ธํ๊ธฐ ํ
์คํธ
ใใ๐ ex code)
import XCTest
@testable import BookReview
class ReviewListPresenterTests: XCTestCase { // ํ
์คํธ ํ๊ณ ์ ํ๋ ํด๋์ค์ XCTestCase ํด๋์ค๋ฅผ ์์๋ฐ๋๋ก ํจ
var sut: ReviewListPresenter! // ํ
์คํธ ๋์
var viewController: MockReviewListViewController!
var userDefaultsManager: MockUserDefaultsManager! // ํ
์คํธ๋ฅผ ์ํ Mock ์์ฑ
override func setUp() { // ํ
์คํธ ๋ฉ์๋๋ค์ด ์คํ๋ ๋๋ง๋ค ์คํ๋๋ ํจ์
super.setUp()
viewController = MockReviewListViewController()
userDefaultsManager = MockUserDefaultsManager()
sut = ReviewListPresenter(
viewController: viewController,
userDefaultsManager: userDefaultsManager
)
}
override func tearDown() { // ํ
์คํธ ๋ฉ์๋๋ค์ด ๋๋ ๋๋ง๋ค ์คํ๋๋ ํจ์
sut = nil
viewController = nil
super.tearDown()
}
// ํจ์์ ์ด๋ฆ์ด test๋ก ์์ํ๋ค๋ฉด ํ
์คํธ ํจ์๋ผ๊ณ ์ธ์ํ๊ฒ ๋์ด ํ
์คํธ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ์๋ ค์ค
func test_viewDidLoad๊ฐ_ํธ์ถ๋ _๋() { // ReviewListPresenter์ viewDidLoad() ํ
์คํธ
sut.viewDidLoad()
XCTAssertTrue(viewController.isCalledSetupNavigationBar)
XCTAssertTrue(viewController.isCalledSetupViews)
}
func test_didTapRightBarButtonItem์ด_ํธ์ถ๋ _๋() { // ReviewListPresenter์ didTapRightBarButtonItem() ํ
์คํธ
sut.didTapRightBarButtonItem()
XCTAssertTrue(viewController.isCalledPresentToReviewWriteViewController)
}
func test_viewWillAppear๊ฐ_ํธ์ถ๋ _๋() { // ReviewListPresenter์ viewWillAppear() ํ
์คํธ
sut.viewWillAppear()
XCTAssertTrue(userDefaultsManager.isCalledGetReviews)
XCTAssertTrue(viewController.isCalledReloadTableView)
}
}
final class MockReviewListViewController: ReviewListProtocol {
var isCalledSetupNavigationBar = false
var isCalledSetupViews = false
var isCalledReloadTableView = false
var isCalledPresentToReviewWriteViewController = false
func setupNavigationBar() {
isCalledSetupNavigationBar = true
}
func setupViews() {
isCalledSetupViews = true
}
func reloadTableView() {
isCalledReloadTableView = true
}
func presentToReviewWriteViewController() {
isCalledPresentToReviewWriteViewController = true
}
}
final class MockUserDefaultsManager: UserDefaultsManagerProtocol {
var isCalledGetReviews = false
var isCalledSetReview = false
func getReviews() -> [BookReview] {
isCalledGetReviews = true
return []
}
func setReview(_ newValue: BookReview) {
isCalledSetReview = true
}
}
๐ UI Test
ใใ๐ UI Components์ ํ์์ ๋์์ด ๋ฌธ์ ์์ด ์๋ํ๋๋ก ์ ๋์ํ๋์ง ํ์ธํ๋ ํ
์คํธ
ใใ๐ ex code)
import XCTest
class MovieReviewUITests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
super.setUp()
continueAfterFailure = false
app = XCUIApplication()
app.launch()
}
override func tearDown() {
super.tearDown()
app = nil
}
func test_navigationBar_title์ด_์ํํ์ ์ผ๋ก_์ค์ ๋์ด_์๋์ง() {
let existNavigationBar = app.navigationBars["์ํ ํ์ "].exists
XCTAssertTrue(existNavigationBar)
}
func test_searchBar๊ฐ_์กด์ฌํ๋์ง() {
let existSearchBar = app.navigationBars["์ํ ํ์ "]
.searchFields["Search"].exists
XCTAssertTrue(existSearchBar)
}
func test_searchBar์_CancelButton์ด_์กด์ฌํ๋์ง() {
let navigationBar = app.navigationBars["์ํ ํ์ "]
navigationBar.searchFields["Search"].tap()
let existSearchBarCancelButton = navigationBar
.buttons["Cancel"].exists
XCTAssertTrue(existSearchBarCancelButton)
}
enum CellData: String {
case existsMovie = "ํ ๋ณผ"
case nonExistsMovie = "๋ผํผ์ ค"
}
// BDD
func test_ํน์ _์ํ๊ฐ_์ฆ๊ฒจ์ฐพ๊ธฐ_๋์ด_์๋์ง() {
let existCell = app.collectionViews
.cells.containing(.staticText, identifier: CellData.existsMovie.rawValue)
.element
.exists
XCTAssertTrue(existCell, "\(CellData.existsMovie.rawValue)์ด๋ผ๋ ์ํ๊ฐ Cell์ ์กด์ฌํฉ๋๋ค.")
}
func test_ํน์ _์ํ๊ฐ_์ฆ๊ฒจ์ฐพ๊ธฐ_๋์ด_์์ง_์๋์ง() {
let existCell = app.collectionViews
.cells.containing(.staticText, identifier: CellData.nonExistsMovie.rawValue)
.element
.exists
XCTAssertFalse(existCell, "\(CellData.nonExistsMovie.rawValue)์ด๋ผ๋ ์ํ๊ฐ Cell์ ์กด์ฌํ์ง ์์ต๋๋ค.")
}
}
๐ Test Coverage(Code Coverage)
ใใ๐ ํ๋ก์ ํธ์์ ๋ช ํผ์ผํธ์ ์ฝ๋์ ๋ํด์ ํ
์คํธ๊ฐ ์์ฑ๋์ด ์๋์ง๋ฅผ ๋ํ๋
ใใ๐ ์ด๋ฅผ ํตํด, ํ
์คํธ๋ฅผ ์งํํ ๋ ์ฝ๋์ ์ด๋ ํ ๋ถ๋ถ์ด ํ
์คํธ๋์๊ณ , ํ
์คํธ๋์ง ์์๋์ง๋ฅผ ์ ์ ์์
๐ Test ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ใใ๐ Nimble(lib), Stubber(lib)
๐ ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ํ
์คํธ ๋ฐฉ๋ฒ
๐ ํ
์คํธ ์์ฑ ๊ตฌ์กฐ(์งํ ํ๋ฆ)
ใใ๐ Given(์ด๋ ํ ์ํ์์) > When(์ด๋ ํ ๊ฒ์ด ์คํ๋ ๋) > Then(์ด๋ค๊ฒ ๋ฐ์ํ๋ค)
๐ ex)
func test_searchBar_textDidChange๊ฐ_ํธ์ถ๋ _๋_request๊ฐ_์ฑ๊ณตํ๋ฉด() {
movieSearchManager.needToSuccessRequest = true
sut.searchBar(UISearchBar(), textDidChange: "")
XCTAssertTrue(
viewController.isCalledUpdateSearchTableView,
"updateSearchTableView๊ฐ ์คํ๋๋ค."
)
}
func test_searchBar_textDidChange๊ฐ_ํธ์ถ๋ _๋_request๊ฐ_์คํจํ๋ฉด() {
movieSearchManager.needToSuccessRequest = false
sut.searchBar(UISearchBar(), textDidChange: "")
XCTAssertFalse(
viewController.isCalledUpdateSearchTableView,
"updateSearchTableView๊ฐ ์คํ๋์ง ์๋๋ค."
)
}
๐ ์ด๋ ํ ํด๋์ค์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ์์กด์ฑ์ด ์๊น
๐ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฃผ์
๋ฐ์(์์ฑ์) ์ฌ์ฉํ๋ ๊ฒ
ใใ๐ ๋จ์ํ ์ฃผ์
ํ๋ ๊ฒ์ผ๋ก ๋๋๋ ๊ฒ์ด ์๋๋ผ, ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ์์กด์ฑ์ ๋ถ๋ฆฌํ ๊ฒ๊น์ง๊ฐ ์์กด์ฑ ์ฃผ์
ใใ๐ ๊ฐ์ฒด ๊ฐ ์์กด์ฑ์ ์ค์ผ ์ ์์ผ๋ฉฐ, ์ ๋ ํ
์คํธ ๋ฐ ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ๋ค๋ ์ฅ์ ์ด ์์
ใใใใ๐ ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ๋ค : (์ผ๋ฐ์ ์ผ๋ก)์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋์์ง๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค๋ ๋ป
๐ ex) Before DI
struct Eat {
func coffee() {
print("์๋ฉ๋ฆฌ์นด๋
ธ")
}
func meal() {
print("ํผ์")
}
}
struct Person {
var todayEat: Eat
// Eat์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด Person๋ ๋ณ๊ฒฝํด์ผ ํจ
func coffee() {
todayEat.coffee()
}
func meal() {
todayEat.meal()
}
}
๐ ex) After DI
protocol Menu {
func printCoffee()
func printMeal()
}
class Eat: Menu {
var coffee: String
var meal: String
init(coffee: String, meal: String) {
self.coffee = coffee
self.meal = meal
}
func printCoffee() {
print("์๋ฉ๋ฆฌ์นด๋
ธ")
}
func printMeal() {
print("ํผ์")
}
}
struct Person {
var todayEat: Menu
func printCoffee() {
todayEat.printCoffee()
}
func printMeal() {
todayEat.printMeal()
}
mutating func changeMenu(menu: Menu) { // ์์กด์ฑ ์ฃผ์
self.todayEat = menu
}
}
let menu1 = Eat(coffee: "์๋ฉ๋ฆฌ์นด๋
ธ", meal: "ํผ์")
let menu2 = Eat(coffee: "๋ผ๋ผ", meal: "ํ๋ฒ๊ฑฐ")
var kid = Person(todayEat: menu1)
kid.printCoffee() // ์๋ฉ๋ฆฌ์นด๋
ธ
kid.printMeal() // ํผ์
kid.changeMenu(menu: menu2)
kid.printCoffee() // ๋ผ๋ผ
kid.printMeal() // ํ๋ฒ๊ฑฐ
๐ Nib, Xib๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ๋์ผํ์ง๋ง, Nib๋ binary ๊ธฐ๋ฐ์ด๋ฉฐ, Xib๋ xml ๊ธฐ๋ฐ
ใใ๐ ๊ณตํต์ : ์ฑ ๊ฐ๋ฐ์์ ์ธํฐํ์ด์ค ๊ตฌ์ฑ์ ์ํด ์ฌ์ฉ๋๋ ํ์ผ ํ์
๐ Xib๋ xml ๊ธฐ๋ฐ์ ํ๋ซ ํ์ผ์ด๊ธฐ์ ์์ค ์ ์ด ๊ด๋ฆฌ ์์คํ
์์ ๋ณด๋ค ์ฝ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ
ใใ๐ ํ๋ซ ํ์ผ : ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ
์คํธ ํ์ผ
๐ ์ถ๊ฐ์ ์ผ๋ก, iOS์ UI๋ฅผ ๊ตฌ์ฑํ๋ ๋ํ์ ์ธ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก Storyboard & Xib(์ธํฐํ์ด์ค ๋น๋) + Code๊ฐ ์์
๐ ์ธํฐํ์ด์ค ๋น๋๋ก ๋ง๋๋ ๋ชจ๋ UI ๊ตฌ์ฑ์์๋ Xib ํ์ผ ํํ๋ก ๋ง๋ค์ด์ง๋ฉฐ, ์ปดํ์ผ ์ ๋ฐ์ด๋๋ฆฌ ํํ์ธ Nib ํ์ผ๋ก ๋ฐ๋๊ฒ ๋จ
๐ ์ฑ ๊ตฌ์ฑ์ ๊ดํ ํ์ ์ค์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋ ๊ตฌ์กฐํ๋ ํ
์คํธ ํ์ผ
๐ key์ value๋ก ๊ตฌ์ฑ๋ dictionary ํํ, key ๊ฐ์ ์ด์ฉํ์ฌ ์ฑ์ ์ค์ ์ ๊ฐ์ ธ์ด
๐ ์ฑ์ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ฒ
๐ ๋ฐํ์ ์์ ์ ๊ธฐ์กด์ ์๋ ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๋ฉ์๋๋ก ๋ฐ๊พธ์ด ์คํํ๋ ๊ฒ
๐ ์ด๋ฏธ ์ ํด์ง iOS์ ํน์ ๋ฉ์๋๊ฐ ์คํ๋ ๋, ํด๋น ๋ฉ์๋ ๋์ ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์คํ๋๋๋ก ๋ฐ๊พธ๋ ๊ฒ
๐ ์ฑ์ด ์ค์น๋ ๋ ๋๋ฐ์ด์ค์ ํน์ฑ์ ๋ง๊ฒ ์ฑ์ ์ค์นํ๋ ์ต์ ํ ๊ธฐ์
๐ ๊ธฐ์ ์์ 3๊ฐ์ง
ใใ๐ ์ฌ๋ผ์ด์ฑ
ใใใใ๐ ์ฑ์ด ์ง์ํ๋ ์ฌ๋ฌ ๋๋ฐ์ด์ค์ ๋ํด ๊ฐ๊ฐ์ ๋ฒ๋ค์ ์์ฑํด๋๊ณ , ์ฌ์ฉ์์ ๋๋ฐ์ด์ค์ ๊ฐ์ฅ ์ ํฉํ ๋ฒ๋ค์ ์ ๋ฌํ๋ ๊ธฐ์
ใใ๐ ์ฃผ๋ฌธํ ๋ฆฌ์์ค
ใใใใ๐ ์ฑ์ ์ค์นํ ๋ ๋น์ฅ ํ์ํ ๊ธฐ๋ฅ๋ง์ ๋ค์ด๋ก๋ํ๊ณ , ์ถํ ์ฌ์ฉ์๊ฐ ํ์๋ก ํ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ํ๋ ๋ฐฉ์
ใใ๐ ๋นํธ์ฝ๋
ใใใใ๐ ์ฑ์คํ ์ด์ ์ฑ์ ์ฌ๋ฆด ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์
๋ก๋ ํ๋ ๊ฒ ์๋๋ผ, ๊ทธ ์ ๋จ๊ณ์ธ ๋นํธ์ฝ๋๋ฅผ ์
๋ก๋ ํ๋ ๋ฐฉ์
ใใใใ๐ ๋นํธ์ฝ๋๋ฅผ ์ฌ์ฉํด ์
๋ก๋๋ฅผ ์งํํ๋ฉด Apple ์ธก์์ ์ด๋ฅผ ์ฌ์ปดํ์ผํ์ฌ App binary๋ฅผ ์์ฑ
ใใใใใใ๐ ๋นํธ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์์ ๋ฐ๋ผ ์ฌ์ปดํ์ผํ๊ฒ ๋๋ฏ๋ก ๊ทธ ๋ ์ต์ ํ๊ฐ ๊ฐ๋ฅํด์ง
ใใใใใใ๐ ๋นํธ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ชจ๋ ๋๋ฐ์ด์ค ์ผ์ด์ค๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ์์ฑํ์ฌ fat binary๋ฅผ ์
๋ก๋
๐ ํ๋ฉด ์ ํ์ฉ ๊ฐ์ฒด
๐ Storyboard์์ ์ถ๋ฐ์ง์ ๋ชฉ์ ์ง๋ฅผ ์ง์ ์ง์ ํ๋ ๋ฐฉ์
๐ @IBDesignable
ใใ๐ ์คํ ๋ฆฌ ๋ณด๋์์ ์ค์๊ฐ์ผ๋ก ํ์ธ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ํค์๋
๐ @IBInspectable
ใใ๐ ์คํ ๋ฆฌ ๋ณด๋์์ ํด๋น ํ๋กํผํฐ ์ค์ ๊ฐ์ ๋ณ๊ฒฝ ์ํฌ ์ ์๊ฒ ๋ง๋๋ ํค์๋
๐ ์๋ฎฌ๋ ์ดํฐ์์๋ ์นด๋ฉ๋ผ, ๋ง์ดํฌ, ์ ํ, ์ผ์๋ฅผ ์ฌ์ฉํ ์ X
๐ Apple์ ํธ์ ์๋ฆผ ๋ฐ๊ธฐ์ ๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ์ ์ง์ํ์ง X
๐ Mac๊ณผ iPhone์ ์ฑ๋ฅ ์ฐจ์ด๋ก CPU, memory์์ ์ฐจ์ด๊ฐ O
๐ ์ฑ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ, ํฐ์น, ๋คํฌ๋ชจ๋ ๋ฑ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์๋ฎฌ๋ ์ดํฐ์์๋ ๊ฐ๋ฅ
๐ ์คํ ๊ฐ๋ฅํ ์ฝ๋์ ๋ฆฌ์์ค๋ฅผ ํ ๊ณต๊ฐ์ ๋ฌถ๋ ๋๋ ํฐ๋ฆฌ ๋ชจ์
๐ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ์ํค๊ธฐ ์ํ ๋ชจ๋ ๊ฒ๋ค์ด ์ ์ฅ๋์ด ์์
๐ ์คํ ํ์ผ, ์ฑ ์์ด์ฝ, Info.plist, ๋ฆฌ์์ค ๋ฑ์ด ํฌํจ๋์ด ์์
๐ Color Asset์ Any, Dark, Light์ ๋ชจ๋ ์ค์ ํ๋ฉด ๋ชจ๋์ ๋ง๊ฒ ์ค์ ํ ์์ด ํ๋ฉด์ ์ถ๋ ฅ๋จ
๐ window์ backgroundColor๋ฅผ systemBackground๋ก ์ค์ ํ์ฌ ๊ธฐ๊ธฐ ํ
๋ง์ ์ค์ ์ ๋ฐ๋ฅด๋๋ก ๊ตฌํ ๊ฐ๋ฅ