[iOS] Question & Answer

r1verfutureยท2022๋…„ 4์›” 13์ผ
0

iOS

๋ชฉ๋ก ๋ณด๊ธฐ
14/30

๐Ÿ’ป iOS

Bounds vs Frame ?

Bounds

  • ๋ณธ์ธ์˜ ์ขŒํ‘œ๊ณ„ ๊ธฐ์ค€
  • The bounds rectangle, which describes the view's location and size in its own coordinate system.)

Frame

  • superview์˜ ์ขŒํ‘œ๊ณ„ ๊ธฐ์ค€
  • The frame rectangle, which describes the view's location and size in its superview's coordinate system.)

์‹ค์ œ ๋””๋ฐ”์ด์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํ™˜๊ฒฝ) ์—์„œ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ?

ํ•˜๋“œ์›จ์–ด

  • ์นด๋ฉ”๋ผ
  • ๋งˆ์ดํฌ
  • ๋‘ ์†๊ฐ€๋ฝ์œผ๋กœ Zoom In / Zoom Out (๋งˆ์šฐ์Šค๋กœ ์ œ์Šค์ณ๋ฅผ ์ทจํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ)
  • ์ „ํ™”
  • ์„ผ์„œ (๊ฐ€์†๋„, GPS, ๊ฐ€์••๊ณ„, ์ฃผ๋ณ€๊ด‘)

API

  • ํ‘ธ์‹œ ์•Œ๋ฆผ ์†ก์ˆ˜์‹ 
  • Handoff
  • MessageUI
  • Face ID (์ง์ ‘ ์–ผ๊ตด ์ธ์‹์€ ์•ˆ๋˜์ง€๋งŒ ์ธ์‹ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๋Š” ์„ค์ • ๊ฐ€๋Šฅ)
  • ๋ธ”๋ฃจํˆฌ์Šค

etc

  • CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด๋˜๋Š” ์ •๋„ ์•Œ์•„๋ณด๊ธฐ (Mac์ด ์•„์ดํฐ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ)
  • ๋„คํŠธ์›Œํฌ ์†๋„ ํ…Œ์ŠคํŠธ

์•ฑ์˜ ์ฝ˜ํ…์ธ ๋‚˜ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์ €์žฅ / ๋ณด๊ด€ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฌด์—‡์ด๋ผ๊ณ  ํ•˜๋Š”๊ฐ€ ?

Core Data

  • ๋ณต์žกํ•˜๊ณ  ํฐ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์ ํ•ฉ
  • ์•ฑ์˜ ์˜๊ตฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ๋งŽ์ด ์‚ฌ์šฉ
  • ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์šด์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ ๊ณต๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†๋„๋Š” ๋น ๋ฅด๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹˜

UserDefaults

  • ๊ฐ„๋‹จํ•œ ์ •๋ณด (ex. ์ž๋™ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€, ์•„์ด๋””, ์•ฑ ์„ค์ • ๋“ฑ ..) ์ €์žฅ์— ์ ํ•ฉ
  • [Key : Value] ์Œ์œผ๋กœ ์ €์žฅ

SQLite

  • C์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ฐ€๋ฒผ์›€
  • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋””์Šคํฌ ํŒŒ์ผ 1๊ฐœ์— ์ €์žฅ
  • ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ (iOS, Android, Linux, Window) ์—์„œ ์‚ฌ์šฉ

Realm

  • ๋ชจ๋ฐ”์ผ์— ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • SQLite, Core Data๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•จ
  • ์šฉ๋Ÿ‰ ์ƒ๊ด€์—†์ด ์†๋„, ์„ฑ๋Šฅ์ด ์œ ์ง€๋จ

์•ฑ ํ™”๋ฉด์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋กœ์ง๊ณผ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฌด์—‡์ด๋ผ๊ณ  ํ•˜๋Š”๊ฐ€ ?

ViewController

  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ View์˜ ๋‚ด์šฉ ์—…๋ฐ์ดํŠธ
  • View์™€ ์‚ฌ์šฉ์ž ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ์‘๋‹ต
  • View ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ
  • ๋ชจ๋“  ์•ฑ์— ํ•˜๋‚˜์ด์ƒ ํฌํ•จ

App thinning ?

  • ์•ฑ์ด ๋””๋ฐ”์ด์Šค์— ์„ค์น˜๋  ๋•Œ, ์•ฑ ์Šคํ† ์–ด์™€ ์šด์˜์ฒด์ œ๊ฐ€ ๋””๋ฐ”์ด์Šค์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์„ค์น˜๋˜๋„๋ก ํ•˜๋Š” ์„ค์น˜ ์ตœ์ ํ™” ๊ธฐ์ˆ 
  • ๋””์Šคํฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ข…๋ฅ˜ : slicing, bitcode, on-demand resource (์ฃผ๋ฌธํ˜• ๋ฆฌ์†Œ์Šค)

Slicing

  • ์•ฑ์ด ์ง€์›ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค์— ๋Œ€ํ•ด ๊ฐ๊ฐ ์กฐ๊ฐ ์•ฑ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ๋””๋ฐ”์ด์Šค์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์กฐ๊ฐ์„ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ์ˆ 
  • ๊ฐœ๋ฐœ์ž๊ฐ€ App store connect์— ์—…๋กœ๋“œํ•˜๋ฉด ์•ฑ ์Šคํ† ์–ด์—์„œ ๋””๋ฐ”์ด์Šค ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ ์กฐ๊ฐ๋“ค์„ ์ƒ์„ฑํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์กฐ๊ฐ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ๋งž๋Š” ์กฐ๊ฐ์„ ๋‹ค์šด๋กœ๋“œ๋ฐ›๋Š” ๊ฒƒ

Bitcode

  • ๊ธฐ๊ณ„์–ธ์–ด๋กœ ๋ฒˆ์—ญ๋˜๊ธฐ ์ „ ๋‹จ๊ณ„์˜ ์ค‘๊ฐ„ํ‘œํ˜„

On-demand Resource

  • ํ•„์š”ํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œ๋ฐ›๋Š” ๊ฒƒ
  • ์‚ฌ์šฉ์ž์˜ ์„ ํƒ์— ๋”ฐ๋ผ ๋‹ค์šด๋กœ๋“œ๋ฐ›๋Š” ๊ฒƒ

์•ฑ์ด ์‹œ์ž‘ํ•  ๋•Œ main.c์— ์žˆ๋Š” UIApplicationMain ํ•จ์ˆ˜์— ์˜ํ•ด์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ธ๊ฐ€ ?


@main ?

  • ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์  (Type-Based Program Entry Points)
  • ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ํ•  ๋•Œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ
  • AppDelegate ํด๋ž˜์Šค (์•ฑ์ด ์‹œ์ž‘๋˜๋Š” ์ง„์ž…์ ์„ ์•Œ๋ ค์ฃผ๊ณ , ์•ฑ์˜ ์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Ÿฐ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•จ) ์˜ ์œ—์ชฝ ์ •์˜ ๋ถ€๋ถ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • Swift 5.3 ver. ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ (์ด์ „ ๋ฒ„์ „๊นŒ์ง€๋Š” @UIApplicationMain์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.)

์•ฑ์ด foreground ์— ์žˆ์„ ๋•Œ์™€ background ์— ์žˆ์„ ๋•Œ ์–ด๋–ค ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ๋‚˜์š” ?

Foreground ์— ์žˆ์„ ๋•Œ

  • ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”์— ๋”ฐ๋ผ background ์•ฑ์„ ์ข…๋ฃŒํ•œ๋‹ค.

Background ์— ์žˆ์„ ๋•Œ

  • ๊ฐ€๋Šฅํ•œ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ AppDelegate ๋ฉ”์†Œ๋“œ๋“ค ?

application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey:Any]?) -> Bool

  • ์•ฑ์„ ์‹คํ–‰ํ•˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • 'launchOptions' ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ์•ฑ์ด ์‹คํ–‰๋œ ์ด์œ  ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค.

applicationDidBecomeActive(_ application: UIApplication)

  • ์•ฑ์ด ํ™”๋ฉด์— ๋œฌ ์ดํ›„ ์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • ์•ฑ์ด Background ์ƒํƒœ์˜€๋‹ค๊ฐ€ Foreground ์ƒํƒœ๋กœ ๋ฐ”๋€ ๊ฒฝ์šฐ์—๋„ ์‹คํ–‰๋œ๋‹ค.

applicationWillResignActive(_ application: UIApplication)

  • ํ™ˆ ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ค์„œ ์•ฑ์ด Background ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • Task ์ผ์‹œ ์ •์ง€ / ํƒ€์ด๋จธ ๋น„ํ™œ์„ฑํ™” ๊ธฐ๋Šฅ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค.

applicationDidEnterBackground(_ application: UIApplication)

  • ์•ฑ์ด Background ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋” ์ด์ƒ์ด ์•ฑ์ด ๋ณด์ด์ง€ ์•Š์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • ๊ณต์œ  ์ž์› ํ•ด์ œ / ์œ ์ € ๋ฐ์ดํ„ฐ ์ €์žฅ ๋“ฑ์˜ ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค.

applicationWillEnterForeground(_ application: UIApplication)

  • ์•ฑ์ด ๋‹ค์‹œ Foreground ์ƒํƒœ๊ฐ€ ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • ๋ณดํ†ต API ๋ฅผ ํ†ตํ•ด ์•ฑ์˜ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์•ฑ์ด In-Active ์ƒํƒœ๊ฐ€ ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ?

  • ํ”ํ•œ ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋„ค์ด๋ฒ„์•ฑ์—์„œ ๊ธฐ์‚ฌ๋ฅผ ์ฝ๊ณ  ์žˆ๋‹ค๊ฐ€ ์ด ๊ธฐ์‚ฌ๋ฅผ ์นด์นด์˜คํ†ก์œผ๋กœ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ ๋„ค์ด๋ฒ„์•ฑ ์œ„๋กœ ์นด์นด์˜คํ†ก ์•ฑ์ด ์‹คํ–‰๋ ํ…๋ฐ, ์ด๋•Œ ๋„ค์ด๋ฒ„์•ฑ์€ In-Active ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

Scene Delegate ?

  • Scene ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์†Œ๋“œ๋“ค
  • ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ 'UISceneDelegate'

UIApplication ๊ฐ์ฒด์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์€ ์–ด๋””์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜์š” ?


Not Running ? Foreground ? Inactive ? Active ? Background ? Suspended ?

  • ์•ฑ์˜ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋Š” ํ‚ค์›Œ๋“œ๋“ค

Not Running

  • ์•ฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ

Foreground

  • ์•ฑ์ด ์‹คํ–‰๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๊ณ  ์žˆ๋Š” ์ƒํƒœ
  • ์ด๋ฒคํŠธ ์ˆ˜์‹  ์—ฌ๋ถ€์— ๋”ฐ๋ผ active์™€ inactive๋กœ ๋‚˜๋‰จ

Inactive

  • ์•ฑ์ด ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์•„์ง ์•„๋ฌด๋Ÿฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์ง€ ์•Š์€ ์ƒํƒœ

Active

  • ์•ฑ์ด ์‹คํ–‰ ์ค‘์ด๋ฉด์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š” ์ƒํƒœ

Background

  • ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ

Suspended

  • ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๊ณ , ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ์ƒํƒœ
  • ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ์•ฑ์ด ์กด์žฌํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, CPU๋‚˜ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ ์–ธ์ œ๋“ ์ง€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋“ฑ์˜ ์ด์œ ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.

NSOperationQueue vs GCD Queue ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

GCD API ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ•„์š”์„ฑ ?

๋™์ž‘ ๋ฐฉ์‹

  • ํ•ด์•ผํ•  ์ž‘์—…์„ Operation ์œผ๋กœ Wrapping ํ•œ ํ›„ Queue ์— ๋„ฃ๊ณ , Queue ์—์„œ ๋‚จ๋Š” ์Šค๋ ˆ๋“œ์— ์ž‘์—…์„ ๋ฐฐ๋ถ„ํ•œ๋‹ค.

ํ•„์š”์„ฑ

  • ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํ•ด์•ผํ•  ๊ฒฝ์šฐ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๊ณ  ์•ฑ์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Global DispatchQueue Qos ์˜ ์ข…๋ฅ˜ ?


iOS ์•ฑ์„ ๋งŒ๋“ค๊ณ , User Interface ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•„์ˆ˜์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ?


Foundation ?


Delegate ?

  • (retain ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€๋ž‘ ๊ทธ ์ด์œ  ๊ผญ ์ถ”๊ฐ€ํ•˜๊ธฐ)

NotificationCenter ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ™œ์šฉ ๋ฐฉ์•ˆ ?


UIKit ํด๋ž˜์Šค๋“ค์„ ๋‹ค๋ฃฐ ๋•Œ ๊ผญ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์“ฐ๋ ˆ๋“œ ์ด๋ฆ„ ?

  • Main Thread
  • Cocoa Touch ์•ฑ์—์„œ๋Š” UIApplication ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Main Thread ์— ๋ถ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

UIApplication

  • ์•ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ์ธ์Šคํ„ด์Šคํ™”๋˜๋Š” ์•ฑ์˜ ์ฒซ๋ฒˆ์งธ ๋ถ€๋ถ„
  • ์•ฑ์˜ Run Loop ๋ฅผ ํฌํ•จํ•œ Main Event Loop ๋ฅผ ์„ค์ •ํ•˜๊ณ , Event ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

Main Event Loop

  • touch, gesture ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  UI Event ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค.

UI Event

  • [UIApplication -> UIWindow -> UIViewController -> UIView -> subviews] ์ˆœ์œผ๋กœ UIResponder ์— ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

App Bundle ์˜ ๊ตฌ์กฐ์™€ ์—ญํ• 


๋ชจ๋“  View Controller ๊ฐ์ฒด์˜ ์ƒ์œ„ ํด๋ž˜์Šค๋Š” ๋ฌด์—‡์ด๊ณ , ์–ด๋–ค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋‚˜์š” ?


๋‚˜๋งŒ์˜ Custom View ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š” ?


View ๊ฐ์ฒด ?


UIView ์—์„œ Layer ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ด๊ณ , ์–ด๋–ค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋‚˜์š” ?


UIWindow ๊ฐ์ฒด์˜ ์—ญํ•  ?


UINavigationController ์˜ ์—ญํ•  ?


TableView ์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ Cell ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” DataSource ๋ฉ”์†Œ๋“œ๋Š” ?


ํ•˜๋‚˜์˜ View Controller ์ฝ”๋“œ์—์„œ ์—ฌ๋Ÿฌ TableView Controller ์—ญํ• ์„ ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜์š” ?


setNeedsLayout vs setNeedsDisplay ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

setNeedsLayout

setNeedsDisplay


NSCache ์™€ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์บ์‹œ๋ฅผ ๊ตฌ์„ฑํ–ˆ์„ ๋•Œ์˜ ์ฐจ์ด์  ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

URLSession ?


prepareForReuse ?

  • Table View ์˜ Delegate ๊ฐ€ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Cell ์„ ์ค€๋น„ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ
  • UITableViewCell ์ด 'reuse identifier' ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๊ทธ Table View ๋Š” dequeueReusableCell(withIdentifier:) ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ง์ „์— prepareForReuse ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Cell ์˜ ์†์„ฑ๋“ค ์ค‘ ๋‚ด์šฉ๊ณผ ๊ด€๋ จ์—†๋Š” ๊ฒƒ (alpha, editing, selection state ๋“ฑ) ๋“ค๋งŒ ์žฌ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ([์ฝ”๋“œ 1] ์ฐธ๊ณ )
// MARK: [์ฝ”๋“œ 1] ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์ง€ ๋ง๋ผ๊ณ  ํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ์‹œ
override func prepareForReuse() {
	super.prepareForReuse()
    
    imageView?.image = nil // Cell ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ด๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์ด์Šˆ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
}
  • tableView(_:cellForRowAt:) ์— ์žˆ๋Š” Table View ์˜ Delegate ๋Š” Cell ์„ ์žฌ์‚ฌ์šฉํ•  ๋•Œ ๋ชจ๋“  ๋‚ด์šฉ์„ ํ•ญ์ƒ ์žฌ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • Table View ๋Š” Cell ์ด reuse identifier ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜, ๊ธฐ์กด Cell ์˜ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด reconfigureRows(at:) ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” prepareForReuse ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • prepareForReuse ๋ฉ”์†Œ๋“œ๋ฅผ override ํ•  ๊ฒฝ์šฐ์—๋Š” superclass ๊ตฌํ˜„์„ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ([์ฝ”๋“œ 2] ์ฐธ๊ณ )
// MARK: [์ฝ”๋“œ 2] prepareForReuse ๋ฉ”์†Œ๋“œ๋ฅผ override ํ•˜๋Š” ์˜ˆ์‹œ
override func prepareForReuse() {
	super.prepareForReuse()
    // ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ ์“ฐ๊ธฐ
}
  • Apple ๊ณต์‹ ๋ฌธ์„œ
  • ๊ถ๊ธˆํ•œ ๊ฒƒ : UITableViewCell ์— init() ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ๊ณผ prepareForReuse() ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ธ์ง€ ..?

๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ• ?


View Controller ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ?


TableView vs CollectionView ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

๐Ÿ’ป Autolayout

Autolayout ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• 3๊ฐ€์ง€ ?

NSLayoutAnchor

  • iOS 9 ๋ถ€ํ„ฐ ๋„์ž…
  • ์œ ๋™์ ์ธ API ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ์ œ์•ฝ์„ ๋งŒ๋“ ๋‹ค.
  • NSLayoutConstraint ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊น”๋”ํ•ด์„œ ์ฝ๊ธฐ ํŽธํ•˜๋‹ค.
  • Apple ๊ณต์‹ ๋ฌธ์„œ

Anchor ์ข…๋ฅ˜

  • widthAnchor
  • heightAnchor
  • topAnchor
  • bottomAnchor
  • leftAnchor
  • rightAnchor
  • leadingAnchor
  • trailingAnchor
  • centerXAnchor
  • centerYAnchor

NSLayoutConstraint

  • iOS 6 ๋ถ€ํ„ฐ ๋„์ž…
  • ์ œ์•ฝ ๊ธฐ๋ฐ˜์˜ ๋ ˆ์ด์•„์›ƒ ์‹œ์Šคํ…œ์—์„œ ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” 2๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„
  • NSLayoutAnchor ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ, ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋”๋ผ๋„ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • NSLayoutConstraint.Attribute ์„œ๋ธŒ ํด๋ž˜์Šค๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•ด์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ œ์•ฝ ์กฐ๊ฑด ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • iOS 8 ๋˜๋Š” OS X 10.10 ๋˜๋Š” ์ด์ „ ๋ฒ„์ „์„ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด NSLayoutAnchor ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • Apple ๊ณต์‹ ๋ฌธ์„œ

NSLayoutConstraint ์„ ์–ธ

// MARK: [์ฝ”๋“œ 3] NSLayoutConstraint ์„ ์–ธ ํ˜•ํƒœ
NSLayoutConstraint(item view1: Any, attribute attr1: NSLayoutConstraint.Attribute, relatedBy relation: NSLayoutConstraint.Relation, toItem view2: Any?, attribute attr2: NSLayoutConstraint.Attribute, multiplier: CGFloat, constant c: CGFloat)

NSLayoutConstraint ๋งค๊ฐœ ๋ณ€์ˆ˜

  • item : ์ œ์•ฝ์„ ์ง€์ •ํ•  ์•„์ดํ…œ
  • attribute : ์ œ์•ฝ์„ ์ง€์ •ํ•  ์•„์ดํ…œ์˜ ์ œ์•ฝ ์†์„ฑ
  • relatedBy : ์ œ์•ฝ์„ ์ง€์ •ํ•  ์•„์ดํ…œ๊ณผ ์ œ์•ฝ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ์•„์ดํ…œ ์‚ฌ์ด์˜ ๊ด€๊ณ„
  • toItem : ์ œ์•ฝ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ์•„์ดํ…œ
  • attribute : ์ œ์•ฝ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ์•„์ดํ…œ์˜ ์ œ์•ฝ ์†์„ฑ
  • multiplier : ์ œ์•ฝ์˜ ๋น„์œจ
  • constant : ์ œ์•ฝ์˜ ์ƒ์ˆ˜๊ฐ’

Visual Format Language

  • ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ASCII ๋ฅผ ์‚ฌ์šฉํ•ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹
  • ASCII ์•„ํŠธ์™€ ์œ ์‚ฌํ•œ ์‹œ๊ฐ์  ํ˜•์‹ ๋ฌธ์ž์—ด๋กœ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹
  • Apple ๊ณต์‹ ๋ฌธ์„œ

Visual Format Language ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ

// MARK: [์ฝ”๋“œ 4] Visual Format Language ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ
class func constraints(withVisualFormat format: String, 
                       options opts: NSLayoutConstraint.FormatOptions = [], 
                       metrics: [String : Any]?, 
                       views: [String : Any]) -> [NSLayoutConstraint]

Visual Format Language ์—์„œ ์‚ฌ์šฉํ•˜๋Š” constraints ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ ๋ณ€์ˆ˜

  • format : ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ํ˜•์‹ ์‚ฌ์–‘
  • options : ์‹œ๊ฐ์  ํ˜•์‹ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์†์„ฑ ๋ฐ ๋ ˆ์ด์•„์›ƒ ๋ฐฉํ–ฅ์„ ์„ค๋ช…ํ•˜๋Š” ์˜ต์…˜
  • matrics : ์‹œ๊ฐ์  ํ˜•์‹ ๋ฌธ์ž์—ด์— ๋‚˜ํƒ€๋‚˜๋Š” ์ƒ์ˆ˜ Dictionary
  • views : ์‹œ๊ฐ์  ํ˜•์‹ ๋ฌธ์ž์—ด์— ํ‘œ์‹œ๋˜๋Š” ๋ณด๊ธฐ Dictionary
    (key : ์‹œ๊ฐ์  ํ˜•์‹ ๋ฌธ์ž์—ด์— ์‚ฌ์šฉ๋œ ๋ฌธ์ž์—ด ๊ฐ’ / value : view ๊ฐœ์ฒด)

Hugging ? Resistance ?


Intrinsic Size ?


์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ UI ๋ฅผ ๊ทธ๋ฆด ๋•Œ์˜ ์žฅ๋‹จ์  ?

  • ๊ฐ„๋‹จํ•œ UI ๋งŒ ๊ทธ๋ฆฌ๋Š” ๊ฒฝ์šฐ์—๋Š” StoryBoard ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” Code Base ๋ฐฉ์‹์ด ๋” ๋‚˜์€ ๋ฐฉ์‹์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
  • Custom View ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” Code Base ๋ฐฉ์‹์ด ๋” ์ข‹๋‹ค. (Code Base ๋ฐฉ์‹์€ ๋ฐ”๋กœ ๋ฐ‘์— ์žˆ๋Š” '์ฝ”๋“œ๋กœ UI ๋ฅผ ๊ทธ๋ฆด ๋•Œ์˜ ์žฅ๋‹จ์  ?' ์ฐธ๊ณ )
  • ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

์žฅ์ 

  • UI ๊ตฌ์„ฑ์„ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • View ์— ์–ด๋–ค ์†์„ฑ๊ณผ ๊ฐ’์„ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์‰ฝ๋‹ค.

๋‹จ์ 

  • StoryBoard ๊ตฌํ˜„์„ ์œ„ํ•ด Xcode ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค.
  • ํ˜‘์—…ํ•  ๋•Œ StoryBoard ์ถฉ๋Œ ๋ฐ ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋“œ์™€ StoryBoard ๊ฐ„ ์—ฐ๊ฒฐ์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋กœ UI ๋ฅผ ๊ทธ๋ฆด ๋•Œ์˜ ์žฅ๋‹จ์  ?

์žฅ์ 

  • StoryBoard ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ Xcode ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€๋ฒผ์›Œ์ง„๋‹ค.
  • ํ˜‘์—…ํ•  ๋•Œ ์ถฉ๋Œ ๋ฐ ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ ํ™•๋ฅ ์ด ๋‚ฎ๋‹ค.
  • StoryBoard ์— ๋น„ํ•ด View ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹๋‹ค.

๋‹จ์ 

  • View ๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • View ์˜ ์†์„ฑ ๋ฐ ๊ธฐ๋Šฅ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • NSLayoutConstraint ๋กœ AutoLayout ์„ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ด์„œ ๋ณต์žกํ•˜๋‹ค. (Snapkit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ import ํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.)

Safe Area ?

  • iOS 11 ์ด์ „๊นŒ์ง€๋Š” 'Safe Area' ๋ผ๋Š” ๊ฐœ๋…์ด ์—†์—ˆ๊ณ , Safe Area ๋Œ€์‹  'Top Layout Guide' ์™€ 'Bottom Layout Guide' ๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์—ˆ๋‹ค. (์ง€๊ธˆ์€ ์ด ๋‘๊ฐ€์ง€ ๊ฐœ๋…์ด Deprecate ๋˜์—ˆ๋‹ค.)
  • ์ƒํƒœ๋ฐ” (Status Bar) / ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ” (Navigation Bar) / ํƒญ๋ฐ” (Tap Bar) ๋“ฑ์— ์˜ํ•ด์„œ View ๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ์  Margin
  • iOS 11 ์ด์ „๊นŒ์ง€๋Š” Top ๊ณผ Bottom ์ชฝ์ด View ๋ฅผ ๊ฐ€๋ฆฌ๋Š” ๊ฒƒ๋งŒ ์‹ ๊ฒฝ์“ฐ๋ฉด ๋˜์—ˆ์ง€๋งŒ, iOS 11 ์ดํ›„๋ถ€ํ„ฐ๋Š” ๋””๋ฐ”์ด์Šค๋ฅผ ๊ฐ€๋กœ๋กœ ๋Œ๋ ธ์„ ๋•Œ์˜ ๋…ธ์น˜ (ex. ํ”ํžˆ ๋งํ•˜๋Š” ์•„์ดํฐ์˜ M์ž ๋ผ์ธ) ์— View ๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ 'Leading Layout Guide' ์™€ 'Trailing Layout Guide' ๊ฐœ๋…๋„ ํ•„์š”ํ•ด์กŒ๋‹ค.
  • Safe Area ๋Š” Top / Bottom / Leading / Trailing ์— ๋Œ€ํ•œ Margin ์„ ๋ชจ๋‘ ๊ฐ€์ง„๋‹ค. (์‹œ์Šคํ…œ์— ์˜ํ•ด ๊ฐ€๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์˜ Margin ์„ ์ž์ฒด์ ์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๋‹ค.)
  • Safe Area ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
  • Safe Area ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด์— ๊ฝ‰ ์ฐจ๊ฒŒ ๋ณด์ด๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ธด ํ•˜์ง€๋งŒ ๋™์˜์ƒ์ด๋‚˜ ์‚ฌ์ง„์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด Safe Area ์•ˆ์— View ๋“ค์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

Left Constraint vs Leading Constraint ?

Left Constraint

  • ์–ด๋–ค ๊ฐ์ฒด์˜ ์™ผ์ชฝ
  • ์ ˆ๋Œ€์ ์ด๊ณ , ํ•ญ์ƒ ํ™”๋ฉด ๋˜๋Š” ์ปจํŠธ๋กค์˜ ์™ผ์ชฝ์„ ์ฐธ์กฐํ•œ๋‹ค.

Leading Constraint

  • ์–ด๋–ค ๊ฐ์ฒด์˜ ์•ž์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ
  • Device Locale (์žฅ์น˜๋ณ„ ๊ตญ๊ฐ€ ์„ค์ •) ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
  • ์ฝ๊ธฐ ๋ฐฉํ–ฅ์ด ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์ธ ๊ตญ๊ฐ€์˜ ์–ธ์–ด (ex. ํžˆ๋ธŒ๋ฆฌ์–ด, ์•„๋ž์–ด) ๋Š” leading ์ด ์˜ค๋ฅธ์ชฝ์ด๊ณ , trailing ์ด ์™ผ์ชฝ์ด๋‹ค.

๐Ÿ’ป Swift

Struct vs Class vs Enum ?


Class ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ?

  • (์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ฐพ์•„๋ณด๊ธฐ)

Copy On Write ๋™์ž‘ ๋ฐฉ์‹ ?


Convinience init ?


AnyObject ?


Optional ?


Struct ?


Subscripts ?


String ์€ ์™œ subscript ๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฐ€์š” ?


instance ๋ฉ”์†Œ๋“œ vs class ๋ฉ”์†Œ๋“œ ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

class ๋ฉ”์†Œ๋“œ vs static ๋ฉ”์†Œ๋“œ ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

Delegate ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์‹œ ?


Singleton ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์‹œ ?


KVO ๋™์ž‘ ๋ฐฉ์‹ ?


Delegates ๋ฐฉ์‹ vs Notification ๋ฐฉ์‹ ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์•ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹๋“ค ?


MVC ๊ตฌ์กฐ ?

  • (๋ธ”๋ก ๊ทธ๋ฆผ ๊ทธ๋ ค์„œ ์ถ”๊ฐ€ํ•˜๊ธฐ)
  • (๊ฐ ์—ญํ• ๊ณผ ํ๋ฆ„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

Protocol ?


Protocol Oriented Programming vs Object Oriented Programming ?


Hashable ?

  • (quatable ์„ ์ƒ์†ํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ์ถ”๊ฐ€ํ•˜๊ธฐ)

mutating ?

  • Swift ์—์„œ Class ๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๊ณ  Struct ์™€ Enum ์€ ๊ฐ’ ํƒ€์ž…์ธ๋ฐ, ๊ฐ’ ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๊ฐ’ ํƒ€์ž… ์•ˆ์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์—์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ ์•ž์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ์„ ์–ธํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
// MARK: [์ฝ”๋“œ 5] mutating ํ‚ค์›Œ๋“œ ์—†์ด ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ํ”„๋กœํผํ‹ฐ ๋ณ€๊ฒฝ ์‹œ๋„
struct Person {
	let name : String
    var age : Int
    
    init(name : name, age : age) {
    	self.name = name
        self.age = age
    }
    
    func changeAge() {
    	age = 10 // ์ด ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
    }
}
  • [์ฝ”๋“œ 5] : ๊ตฌ์กฐ์ฒด๋Š” ์ƒ์ˆ˜ (immutable) ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์—†์–ด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
// MARK: [์ฝ”๋“œ 6] mutating ํ‚ค์›Œ๋“œ ์—†์ด ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ํ”„๋กœํผํ‹ฐ ๋ณ€๊ฒฝ ์‹œ๋„
struct Person {
	let name : String
    var age : Int
    
    init(name : name, age : age) {
    	self.name = name
        self.age = age
    }
    
    mutating func changeAge() {
    	age = 10
    }
}

var r1verfuture = Person(name : "r1verfuture", age : 25) // 'Person' ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ 'r1verfuture' ๋ณ€์ˆ˜์— ๋„ฃ๋Š”๋‹ค.
r1verfuture.changeAge() // r1verfuture ์˜ age ํ”„๋กœํผํ‹ฐ๋ฅผ 10 ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
print(r1verfuture.age) // 10 ์ด๋ผ๊ณ  ์ถœ๋ ฅ๋œ๋‹ค.
  • [์ฝ”๋“œ 6] : changeAge ๋ฉ”์†Œ๋“œ์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

ํƒˆ์ถœ ํด๋กœ์ € ?


Extension ?


Extension ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ override ํ•  ์ˆ˜ ์žˆ๋‚˜์š” ?


์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜ ?


defer ?


defer ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ ?


defer ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ?


property wrapper ?


Generic ?


some ํ‚ค์›Œ๋“œ ?


Result ํƒ€์ž… ?


Codable ?


๐Ÿ’ป ARC

ARC ?

  • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ 4๊ฐ€์ง€ ์ค‘ ํž™ ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ
  • ์ธ์Šคํ„ด์Šค๊ฐ€ ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•œ๋‹ค.
  • ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ 'ARC'

Retain Count ๋ฐฉ์‹ ?


Strong ์ฐธ์กฐ ๋ฐฉ์‹ ? Weak ์ฐธ์กฐ ๋ฐฉ์‹ ?

  • strong : ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋˜์–ด RC๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ
  • weak : ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋˜์–ด๋„ RC๊ฐ’์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ
  • ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ 'Strong & Weak'

์ˆœํ™˜ ์ฐธ์กฐ ?


๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋‚˜์š” ?


๐Ÿ’ป Functional Programming

์ˆœ์ˆ˜ ํ•จ์ˆ˜ ?


ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ?


๊ณ ์ฐจ ํ•จ์ˆ˜ ?


Swift Standard Library ์˜ map ? filter ? reduce ? compactMap ? flatMap ?


๐Ÿ’ป Architecture

์•Œ๊ณ  ์žˆ๋Š” ์•„ํ‚คํ…์ณ ?

  • (MVVM, MVI, Ribs, VIP ๋“ฑ ์ฐพ์•„์„œ ์ถ”๊ฐ€ํ•˜๊ธฐ)

์˜์กด์„ฑ ์ฃผ์ž… ?


๐Ÿ’ป SwiftUI

@State ?


๐Ÿ’ป Combine

PassthroughSubject ?


@Published ?


AnyCancellable ?


sink ?


throttle vs debounce ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

๐Ÿ’ป Rx

Reactive Programming ?


RxSwift ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ?


RxSwift ์˜ ๋‹จ์  ?


RxSwift ์—์„œ Hot Observable vs Cold Observable ?


Subject ์˜ ์ข…๋ฅ˜์™€ ์ฐจ์ด์  ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

Subject vs Driver ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

Single vs Completable vs Maybe ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)
  • (๊ฐ๊ฐ ์–ธ์ œ ์ ์šฉํ•˜๋ฉด ์ข‹์€์ง€๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

MRC

ARC ๋Œ€์‹  Manual Reference Count ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค ?

  • (๋ฉ”์†Œ๋“œ๋“ค ๊ฐ๊ฐ์˜ ์—ญํ• ๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

retain vs assign ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

ํŠน์ • ๊ฐ์ฒด๋ฅผ autorelease ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ๊ณผ์ • ?


Autorelease Pool ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ๊ณผ ์˜ˆ์‹œ ?

  • (2๊ฐ€์ง€ ์ด์ƒ ์ถ”๊ฐ€ํ•˜๊ธฐ)

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ์š” ?

Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];

๐Ÿ’ป Advanced

method swizzling ?

  • (์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•˜๋Š”์ง€๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

NSCoder ํด๋ž˜์Šค๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์จ์•ผ ํ•˜๋‚˜์š” ?


Responder Chain ๊ตฌ์กฐ ?


First Responder ์—ญํ•  ?

  • (์ •์˜๋ถ€ํ„ฐ ์ฐพ์•„๋ณด๊ธฐ)

NSObject ๋ถ€ํ„ฐ UIButton ๊นŒ์ง€ ์ƒ์† ๊ณผ์ •์˜ ๊ณ„์ธต๊ณผ ์—ญํ•  ?


Shallow Copy vs Deep Copy ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

Push Notification ๋ฐฉ์‹ ?


Foundation vs Core Foundation ํ”„๋ ˆ์ž„์›Œํฌ ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

NSURLConnection ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Delegate ๋ฉ”์„œ๋“œ๋“ค ?


Synchronous ๋ฐฉ์‹๊ณผ Asynchronous ๋ฐฉ์‹์œผ๋กœ URL Connection ์„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ์˜ ์žฅ๋‹จ์  ?


Plist ํŒŒ์ผ ๊ตฌ์กฐ์™€ Plist ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ ํ•ฉํ•œ ํด๋ž˜์Šค ?


Core Data vs Sqlite ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํŒŒ์„œ, ๊ฐ์ฒด ๋ณ€ํ™˜ ๋ฐฉ์‹ ?


์›น ์„œ๋ฒ„์™€ HTTP ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ฑฐ๋‚˜ ๋ฐ›์œผ๋ ค๋ฉด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๋™์ž‘ ๋ฐฉ์‹ ?


Protocol ์—์„œ๋Š” var ๋งŒ ๋˜๋Š” ์ด์œ  ?


DispatchQueue.main.sync ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ ?


Run Loops ?


๐Ÿ’ป Objective-C

Swift ์˜ ํด๋กœ์ € vs Objective-C ์˜ ๋ธ”๋ก ?


Mutable ๊ฐ์ฒด ?

  • (์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์˜ˆ์‹œ๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

Immutable ๊ฐ์ฒด ?

  • (์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์˜ˆ์‹œ๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

Mutable ๊ฐ์ฒด vs Immutable ๊ฐ์ฒด

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

dynamic ?


property ?


dynamic vs property ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

@property ๋กœ ์„ ์–ธํ•œ NSString* title ์˜ getter / setter ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์„ธ์š”.


@property ์—์„œ atomic vs nonatomic

  • (์–ด๋–ค ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•œ์ง€, ์–ด๋Š ๊ฒƒ์ด ๊ธฐ๋ณธ์ธ์ง€๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)
  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

@property ๋กœ ์„ ์–ธํ•œ๋‹ค๋Š” ์˜๋ฏธ ?


@property ๋กœ ์„ ์–ธํ•  ๋•Œ .h ์— ๋„ฃ์„ ๊ฒฝ์šฐ vs .m ์— ๋„ฃ์„ ๊ฒฝ์šฐ ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

-performSelector:withObject:afterDelay: ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ์ธ์ž๊ฐ’์˜ ๊ฐ์ฒด๋Š” retain ๋˜๋‚˜์š” ?

  • (์ด์œ ๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

Objective-C ์—์„œ ์บก์Šํ™”๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ?

  • (์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ถ”๊ฐ€ํ•˜๊ธฐ)

Fast Enumeration ?


unnamed category ๋ฐฉ์‹ ?


Category ํ™•์žฅ vs Subclass ํ™•์žฅ ?

  • (๊ณตํ†ต์ ๋„ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ)

Category ๋ฐฉ์‹ ?


Objective-C ์—์„œ Protocol ์ด๋ž€ ?


Objective-C++ ๋ฐฉ์‹ ?

  • (์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ)

์ฐธ๊ณ 

  • https://github.com/JeaSungLEE/iOSInterviewquestions
  • ๋ฉด์ ‘ ์‹œ๊ธฐ๊ฐ€ wwdc ์ดํ›„ (7์›” ~ 11์›”) ๋ผ๋ฉด ํ•ด๋‹น ๋…„๋„ wwdc ์„ธ์…˜๋“ค์„ ๋ด๋‘๋ฉด ์—„์ฒญ ์ข‹๋‹ค.
profile
#iOS #Swift #Developer #Python

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด