관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. iOS앱의 구조 및 cocoa touch 프레임워크 본문

iOS 기본 (swift)

[iOS - swift] 2. iOS앱의 구조 및 cocoa touch 프레임워크

jake-kim 2020. 4. 2. 14:27

1. 앱의 프로세스 구조

 1) 엔트리 포인트(UIApplicationMain) :

-> 내재적으로 존재하는 main()함수에서 UIApplicationMain를 호출(info.plist를 바탕으로 앱에 필요한 데이터와 객체 로드)

-> UIApplication객체 반환

-> AppDelegate객체 생성하고 UIApplication객체와 연결

AppDelegate.swift : iOS시스템은 앱을 실행할 때 @UIApplicationMain을 찾아가, 해당 클래스를 델리게이트로 지정

 - UIApplication은 앱 그 자체(생성한 객체, 앱의 기능 모두 이곳에 포함되어 있는 하위 객체)

 - AppDelegate(싱글톤)는 UIApplication으로부터 위임받은 일부 권한을 이용하여 상호작용하는 역할 

 

2)  iOS12이하 앱의 라이프 사이클 : AppDelegate가 관리

 - Not Running (앱이 시작되지 않았거나 시스템에 의해 종료된 상태)

 - Inactive (앱이 실행 중, 이벤트를 받지 않은 상태)

 - Active (앱 실행 중, 이벤트 받은 상태)

 - Background (앱이 백그라운드에 있지만 코드가 실행되고 있는 상태)

 - Suspended (앱이 메모리에 남아있지만 실행되지 않은 경우)

그림 출처 : apple Developer

3)  iOS13이상 앱의 라이프 사이클 : Scene에 의한 라이프 사이클

- scene은 기기에서 실행중인 앱 UI의 한 인스턴스를 의미(사용자는 한 앱을 동시에 여러 개 실행 가능)

- 유저는 각 앱에 대해 여러 Scene을 만들고 각 Scene마다 다른 상태가 될 수 있음

- 하나의 앱은 여러개의 Scene을 갖을 수 있으며, 새로운 Scene을 만들어 달라고 요청하면 unattached상태로 만듦

Scene에 의한 라이프사이클

2. 코코아 터치 프레임 워크

* 프레임워크 : 애플리케이션 제작을 빠르고 편라하게 할 수 있도록 미리 뼈대를 이루는 각종 코드를 제작하여 모아둔 것

 - 코코아 터치 프레임 워크의 주 프레임워크 = UIKit + Foundation

 

1) 코코아 터치 프레임 워크 vs 코코아 프레임워크 : 코코아프레임워크로 만든것이 코코아 터치 프레임 워크

 - 코코어 터치라는 것은 가장 상위계층이라는 의미(애플리케이션 프레임워크 계층)

 

2) 계층 구조 

 - Cocoa Touch(애플리케이션 프레임워크 계층).        (코코아 터치 프레임 워크 속함. UIKit, GameKit...)

 - Media                                                                   (그래픽, 멀티미디어, 오디오)

 - Core Service                                                         (GPS, 환경 설정)

 - Core OS                                                                (커널, 파일시스템, 네트워크, 디바이스 드라이버)

 

 * 앱을 따로 설치 안해도 디폴트로 설치되어 있는 "bundle-program"(bundle-application)들을 앱 내부에서 쉽게 확장할 수 있도록 제공하는 프레임워크를 "In-App Framework"라고하는데, 이 중 가장 많이 쓰는 것은 "cocoa framework"임

3. View Controller

1) Contents View Controller : 뷰에 콘텐츠를 표시하는 뷰 컨트롤러

2) Container View Controller : 콘텐츠 뷰 컨트롤러들을 연결해주는 뷰 컨트롤러 (네비게이션 컨트롤러, 탭 바 컨트롤러, 페이지 컨트롤러)

3) 뷰의 계층 구조

 - Root View (Contents View)

4) 뷰 컨트롤러에 해당하는 클래스 : 아래 클래스(UIKit에 있는 것들)을 상속받아서 작성

 - UIViewController

 - UINavigationController

 - UITableViewController

 - UITaabbarController

 - UISplitViewController

 

5) 뷰 컨트롤러의 생명주기 : Appearing -> Appeared -> Disappearing -> Disappeared

 - Appearing : 뷰 컨트롤러가 화면에 등장하기 바로 직전까지의 상태

 - Appeared : 화면 등장한 상태

 - Disappearing

 - Disappered

 ※ 이것을 이해하면 각 뷰 컨트롤러에서의 viewWIllAppear, viewDidDisAppear과 같은 메소드 사용 용이

 

4. 뷰의 layout 생명주기

cf) 일반적인 뷰 : viewWillAppear() -> viewDidAppear() -> viewWillDisappear() -> viewDidDisappear()

 

* 뷰 컨트롤러가 레이아웃을 설정하는 과정

 -> viewWillLayoutSubviews()

 -> 뷰 컨트롤러의 컨텐츠 뷰가 layoutSubviews() : 현재 정보를 가지고 레이아웃 배치, subview들도 동일한 메소드 호출

 -> viewDidLayoutSubviews()

 

1) viewWillLayoutSubviews()

- 해당 뷰의 bounds*가 변하면 뷰는 subview들의 위치를 조정

- 용도 : 뷰 추가&제거, 뷰 크기 변경, 레이아웃 제약 변경, 뷰와 관련된 프로퍼티 갱신

 

 * bounds : 자기 자신을 기준으로 위치나 크기를 나타낸 것

    frame : super view를 기준으로 위치나 크기를 나타낸 것

    해당내용 참고 : ios-development.tistory.com/111

 

2) layoutSubViews()

- 뷰의 크기 발생(Auto Layout) -> autoresizingMask프로퍼티를 설정하여 superview의 크기가 변경되었을 때 어떻게 대응할지 정의하는 곳

- 해당 뷰의 크기가 변경될 시 subview들에게 auto resizing동작을 적용하며, subview들에게 연쇄적으로 적용

 

3) viewDidLayoutSubviews()

- 레이아웃이 결정되고 나서 호출

- 용도 : tableView.reLoadData(), 다른 뷰들의 컨텐츠 갱신

 

참조 : developer.apple.com/documentation/uikit/uiviewcontroller

Comments