πŸ“± iOS/-- UIKit

(iOS) iOSμ•±μ˜ ꡬ쑰와 μ•±μ˜ μ‹€ν–‰κ³Όμ •, μ΄ˆκΈ°ν™” κ³Όμ •

Newmon 2021. 7. 18. 13:24

iOS μ•±μ˜ ꡬ쑰

iOS앱은 μ‚¬μš©μž μ •μ˜ μ½”λ“œ, μ‹œμŠ€ν…œ ν”„λ ˆμž„μ›Œν¬ 간에 μƒν˜Έμž‘μš©μœΌλ‘œ λ™μž‘ν•œλ‹€.

  • μ‚¬μš©μž μ •μ˜ μ½”λ“œ (Custom code) : μ›ν•˜λŠ” κΈ°λŠ₯κ³Ό UIλ₯Ό κ΅¬ν˜„ ν•  수 μžˆλ‹€.
  • μ‹œμŠ€ν…œ ν”„λ ˆμž„μ›Œν¬ (System Framework) : νŽΈμ§‘ν•  수 μ—†λŠ” λΆ€λΆ„. (iOS기반의 앱이 μ‹€ν–‰λ˜λŠ” 데에 ν•„μš”ν•œ κΈ°λ°˜ν™˜κ²½μ„ μ œκ³΅ν•œλ‹€.)

 

iOS μ•±μ˜ μ‹€ν–‰ κ³Όμ • (Object-C κΈ°λ°˜μΌλ•Œ)

C언어에 뿌리λ₯Ό λ‘” λͺ¨λ“  앱은 main() ν•¨μˆ˜λ‘œ μ‹œμž‘λœλ‹€ (Entry Point) iOS앱도 Object-C κΈ°λ°˜μ΄λ―€λ‘œ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. ν•˜μ§€λ§Œ iOS ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜λ©΄ main()ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§€λ©°, μ΄λŠ” κ±΄λ“œλ¦΄ ν•„μš”κ°€ μ—†λ‹€.

 

Main.m

main()ν•¨μˆ˜λŠ” main.m νŒŒμΌμ•ˆμ— μƒμ„±λœλ‹€.

int main(int argc, char *argv[]) {
 @autoreleasepool {
  return UIApplicationMain(argc, argv, nil,
   NSStringFromClass([AppDelegate class]));
 } 
}

 

λ©”μΈν•¨μˆ˜μ˜ λ™μž‘

 

  1. 앱이 μ‹€ν–‰λ˜λ©΄μ„œ 맨 처음 main()ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.
  2. main()ν•¨μˆ˜λŠ” UIApplicationMain()ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
  3. UIApplicationMain()ν•¨μˆ˜λŠ” UIApplication객체λ₯Ό μƒμ„±ν•œλ‹€. 이 κ°μ²΄λŠ” μ•±μ˜ 본체에 ν•΄λ‹Ήλœλ‹€.
  4. UIApplicationκ°μ²΄λŠ” info.plist νŒŒμΌλ‘œλΆ€ν„° μ•± ꡬ성에 ν•„μš”ν•œ 정보듀을 λ‘œλ“œν•œλ‹€.
  5. 이벀트 루프 및 μ΄ˆκΈ°μ„€μ •μ„ μ§„ν–‰ν•œλ‹€.
  6. μ‹€ν–‰ μ™„λ£Œ 직전에 μ•± 델리게이트의 application(_:didFinishLaunchingWithOptions:)λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€.

 

  • UIApplicationMain()ν•¨μˆ˜λŠ” iOSμ•± λΆ€λΆ„μ˜ μ—”νŠΈλ¦¬ ν¬μΈνŠΈκ°€ λœλ‹€. 객체λ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€ 핸듀링, κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ»€μŠ€ν…€ μ½”λ“œλ₯Ό 호좜, μ•± 생성 μ΄ˆκΈ°μ„€μ •μ„ κ΅¬ν˜„ν•œλ‹€.
import UIKit
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv, nil,
            NSStringFromClass(AppDelegate.self)
)
  • λ°˜ν™˜λœ 객체인 UIApplication은 μ•±μ˜ 본체가 λœλ‹€. μ»€μŠ€ν…€ μ½”λ“œλ“€, 이벀트 루프, ν‘Έμ‹œ λ“±... μ•±μ˜ κΈ°λŠ₯듀을 λͺ¨λ‘ ν¬ν•¨ν•œ μƒμœ„κ°μ²΄κ°€ UIApplication이닀. UIApplcation은 AppDelegateμ—κ²Œ κΆŒν•œμ„ μœ„μž„ν•˜μ—¬ μ»€μŠ€ν…€μ½”λ“œλ₯Ό μ²˜λ¦¬ν•œλ‹€.
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
}

 

 

iOS μ•±μ˜ μ‹€ν–‰ κ³Όμ • (Swift κΈ°λ°˜μΌλ•Œ)

μŠ€μœ„ν”„νŠΈ 기반 ν”„λ‘œμ νŠΈμ—λŠ” main.mνŒŒμΌλ„ μ—†κ³ , μ—”νŠΈλ¦¬ ν¬μΈνŠΈλ„ μ—†λ‹€.

AppDelegate.swift νŒŒμΌμ„ 보면 @main μ΄λΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜ ν‘œκΈ°κ°€ μžˆλŠ”λ°, μ–΄λ…Έν…Œμ΄μ…˜μ΄ ν‘œμ‹œλœ ν΄λž˜μŠ€κ°€ 델리게이트둜 μ§€μ •λœλ‹€. 이 ν‘œκΈ°λ₯Ό ν†΅ν•˜μ—¬ μœ„μ—μ„œ λ§ν•œ λ©”μΈν•¨μˆ˜λ™μž‘μ˜ 1~5λ²ˆμ„ λŒ€μ²΄ν•œλ‹€. μ΄ν›„μ˜ 과정은 κ°™λ‹€.

즉, λ”°λΌμ„œ μŠ€μœ„ν”„νŠΈ 기반이면 λ‹€μŒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

 

  1. @mainμ–΄λ…Έν…Œμ΄μ…˜μ„ μ°Ύκ³ , ν•΄λ‹Ή 클래슀λ₯Ό μ‹€ν–‰ν•œλ‹€.
  2. μ»€νŠΈν…€ μ½”λ“œμ—μ„œλŠ” AppDelegate클래슀의 application(_:didFinishLaunchingWithOptions:)λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.
  3. (앱이 μ‹€ν–‰λ˜λŠ” μ‹œμ μ— μ²˜λ¦¬ν•΄μ•Όν•  λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ—¬κΈ° μž‘μ„±ν•˜λ©΄ λœλ‹€.)
  4. 이벀트 루프가 μ‹€ν–‰λ˜λ©°, μž‘μ„±ν•œ μ»€μŠ€ν…€ μ½”λ“œλ“€μ΄ μ‹€ν–‰λœλ‹€.
  5. 앱이 μ’…λ£Œλ λ•Œ, μ•±μ—λŒ€ν•œ λ©”λͺ¨λ¦¬μ œκ±°λ₯Ό μœ„ν•˜μ—¬ applicationWillTerminate(_:)λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€. (앱이 μ’…λ£Œλ˜λŠ” μ‹œμ μ— μ²˜λ¦¬ν•΄μ•„ν•  λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ—¬κΈ° μž‘μ„±ν•˜λ©΄ λœλ‹€)