UIApplication의 인스턴스가 main thread에 붙고(attach)
이 UIApplication은 앱을 시작할 때 인스턴스화 되는 앱의 첫번째 부분이고
앱의 run loop를 포함하여 main event loop를 설정하고 event처리를 시작함
앱의 main event loop는 touch, gesture등의 모든 UI event를 수신함
앱의 UI event는 일반적으로 UIApplication -> UIWindow -> UIViewController -> UIView -> subviews (UIButton 등)와 같이 chain으로 연결되는데, 이 responder chain을 따라 UIResponder로 전달
Responder는 버튼 누르기, 탭, pinch, 확대/축소, 스와이프 등의 이벤트를 UI 변경사항으로 처리합니다. 따라서 이러한 일련의 event chain이 UIKit의 main thread에서 작동하는 이유임.
label이나 View는 UIApplication의 자식이므로, 모든 이런 UI작업은 main thread의 “일부”라고 할 수 있음.
그래서 모든 이벤트는 main thread의 일부가 되며, main thread에서 처리해야합니다
UIKit은 Thread-safe 하지 않습니다. 그래서 모든 처리를 Serial 하게 처리해야 합니다. 그래서 UI는 Main Thread 에서 synchronously 하게 동작해야 합니다.
당신이 해야할 일은 항상 UIKit에 대한 호출이 항상 main thread에서 이루어 지도록하는 것입니다. 따라서 UIKit 객체가 main thread에서 액세스되어야한다는 사실은, 성능에 유리하도록 한 apple의 디자인 결정입니다
알려진 것들로 이루어진 디렉토리, 실행 가능한 코드와 그 코드가 사용하는 자원들을 포함하고 있다.
코드와 자원을 모으는 구조를 제공하여 개발자 경험을 향상시키는 것을 가장 우선시 하는데, 이 구조는 코드나 자원의 예측 가능한 로딩뿐만 아니라 지역화 같은 시스템 차원의 기능도 허용한다.
번들은 크게 앱 번들, 프레임워크 번들, Loadable 번들로 나눌 수 있다.
앱 번들은 실행될 수 있는 executable과 그 executable을 설명하는 Info.plist 파일 그리고 executable에서 사용되는 launch 이미지를 포함한 asset과 자원, 인터페이스 파일, string 파일, 데이터 파일로 이루어져 있다.
프레임워크 번들은 dynamic shared library 라 불리는 동적 공유 라이브러리에서 사용되는 코드와 자원을 포함하고 있다.
Loadable 번들은 앱의 기능성을 확장시켜주는 실행 가능한 코드와 자원을 포함하고 있고 플러그인이 대표적인 예시이다.
번들의 컨텐츠는 Bundle.main을 사용해서 접근할 수 있으며 대부분의 경우 url(forResource:withExtension:)메서드를 사용하여 특정 자원의 위치를 알아낼 수 있다.
Bundle.main.url(forResource: "Photo", withExtension: "jpg")
모든 앱 번들은 앱에 대한 정보가 담긴 Info.plist 파일을 가지며 bundleURL과 bundleIdentifier를 포함한 몇몇 메타 데이터는 아래와 같이도 접근할 수 있다.
let bundle = Bundle.main
bundle.bundleURL // 앱의 저장위치
bundle.bundleIdentifier // identifier
이 방법은 required init을 작성해야함
사용자 인터페이스의 기본 구성요소로 화면의 직사각형 영역에 대한 콘텐츠를 관리하는 객체. 모든 뷰에 공통적인 동작을 정의하며 UIButton, UIImageView, UILabel 과 같은 모든 뷰 클래스의 상위 클래스
사용자와 상호 작용
그리기 및 애니메이션
Core Graphics, UIViewAnimations, CoreAnimation
레이아웃 및 하위보기 관리
오토레이아웃
이벤트 처리
UIResponder → 터치 및 기타 유형의 이벤트 응답
제스처 인식
렌더링에 사용하기 위한 뷰의 Core Animation Layer 객체
var layerClass: AnyClass
default는 CALayer이고 이 프로퍼티르를 오버라이딩하면 다른 레이어 클래스를 반환하게 할 수 있다.
먼저 레이어는 주로 뷰의 backing store를 제공하는 용도로 사용하지만 어떤 경우에는 뷰가 없이도 컨텐츠를 표시하기 위해 사용될 수도 있다.
backing store는 뷰의 컨텐츠를 캐싱한다는 의미이다.
레이어의 주요한 임무는 개발자가 제공하는 시각적인 컨텐츠를 관리하는 것이지만 동시에 레이어 스스로가 가지고 있는 시각적인 속성들도 있다.
배경색이나 테두리 관련 속성, 그림자 속성
이를 위해서 레이어는 컨텐츠의 위치, 사이즈, 변형 정보들을 보관한다. 이 정보들을 변경하면 애니메이션이 된다.
레이어는 효과적으로 뷰와 애니메이션을 보여주기 위한 인프라를 제공해주는 것이고 이벤트를 받거나, 직접 컨텐츠를 그리거나, 리스폰더 체인에 참여하는게 불가능하다. 또한 view에서 컨텐츠를 그리면 메인스레드에서 CPU로 draw 메서드를 처리하기 때문에 비용이 크지만 layer는 GPU를 사용하기 때문에 비용이 크지 않다.
UIWindow는 사용자 인터페이스에 배경(backdrop)을 제공하고, 중요한 이벤트 처리 행동(behaviors)을 제공하는 객체입니다.
Windows는 자신의 시각적 모습(visual appearance)을 가지고 있지 않지만, 앱 View의 프레젠테이션에 중요합니다.
스크린에 나타나는 모든 View는 Window로 묶여 있으며, 각 Window는 앱의 다른 View와 독립적입니다.
앱에서 받은 이벤트는 처음에는 해당 View개체로 라우팅되고, 해당 이벤트는 해당 View로 전달됩니다.
Windows는 Viewcontroller를 사용하여 방향 변경을 구현하고, 앱 작동의 기본요소인 다른 많은 작업을 수행합니다.
Windows는 앱의 기본요소이지만, 코드에서 최소한의 방식으로 상호작용합니다.
UIWindow는 UIView의 하위클래스이다.
tableView(:numberOfRowsInSection) -> Int : 섹션별 cell 개수를 리턴합니다.
tableView(:cellForRowAt:) -> UITableViewCell : 반환할 TableViewCell을 정의합니다.
1.viewDidLoad() 에서 register 함수를 사용해서 셀을 등록한다.
@IBOutlet weak var customTableView: UITableView!
@IBOutlet weak var customTableView2: UITableView!
override func viewDidLoad() {
customTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
customTableView2.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
2.func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 에서 파라미터로 받는 tableView를 객체 비교를 통해 구분한다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == customTableView {
// 구현
} else if tableView == customTableView2 {
// 구현
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch tableView.tag {
case 0:
// 구현
case 1:
// 구현
default:
break
}
}
참고자료
- https://github.com/iOS-SOPT-iNNovation/iOS_Traning/issues/16
- https://neph3779.github.io/ios/WhatIsAppBundle/
- https://github.com/jwonyLee/TIL/blob/master/iOS/Interview/ViewController.md
- https://github.com/lunchScreen/Interview_Questions/issues/20
- https://github.com/ios-study-boost/iOSInterviewquestions/issues/36
- https://jeonyeohun.tistory.com/363
- https://zeddios.tistory.com/283
- https://tong94.tistory.com/26
- https://github.com/iOS-SOPT-iNNovation/iOS_Traning/issues/17
- https://github.com/jwonyLee/TIL/blob/master/iOS/Interview/two-TableView.md