iOS 개념 정리 - 3

유호준·2023년 1월 22일
0

iOS

목록 보기
4/8

UIKit 클래스들을 다룰 때 꼭 처리해야하는 애플리케이션 쓰레드 이름은 무엇인가?

Main Thread

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의 디자인 결정입니다

App Bundle의 구조와 역할에 대해 설명하시오.

알려진 것들로 이루어진 디렉토리, 실행 가능한 코드와 그 코드가 사용하는 자원들을 포함하고 있다.

코드와 자원을 모으는 구조를 제공하여 개발자 경험을 향상시키는 것을 가장 우선시 하는데, 이 구조는 코드나 자원의 예측 가능한 로딩뿐만 아니라 지역화 같은 시스템 차원의 기능도 허용한다.

번들은 크게 앱 번들, 프레임워크 번들, 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

모든 View Controller 객체의 상위 클래스는 무엇이고 그 역할은 무엇인가?

UIViewController

  • 기본 데이터의 변경에 대한 응답으로 뷰의 콘텐츠를 업데이트
  • 뷰와 사용자 상호 작용에 응답
  • 뷰 크기 조정 및 전체 인터페이스의 레이아웃 관리
  • 앱에서 다른 뷰 컨트롤러를 포함한 다른 객체와 조정

자신만의 Custom View를 만들려면 어떻게 해야하는지 설명하시오.

  1. UIView 클래스를 상속받아 코드를 작성하여 만드는 방법
  2. Xib를 이용해 view를 디자인하고 이를 불러와 사용하는 방법

    이 방법은 required init을 작성해야함

View 객체에 대해 설명하시오.

사용자 인터페이스의 기본 구성요소로 화면의 직사각형 영역에 대한 콘텐츠를 관리하는 객체. 모든 뷰에 공통적인 동작을 정의하며 UIButton, UIImageView, UILabel 과 같은 모든 뷰 클래스의 상위 클래스

  • 사용자와 상호 작용
    그리기 및 애니메이션
    Core Graphics, UIViewAnimations, CoreAnimation

  • 레이아웃 및 하위보기 관리
    오토레이아웃

  • 이벤트 처리
    UIResponder → 터치 및 기타 유형의 이벤트 응답
    제스처 인식

UIView 에서 Layer 객체는 무엇이고 어떤 역할을 담당하는지 설명하시오.

렌더링에 사용하기 위한 뷰의 Core Animation Layer 객체

var layerClass: AnyClass

default는 CALayer이고 이 프로퍼티르를 오버라이딩하면 다른 레이어 클래스를 반환하게 할 수 있다.

먼저 레이어는 주로 뷰의 backing store를 제공하는 용도로 사용하지만 어떤 경우에는 뷰가 없이도 컨텐츠를 표시하기 위해 사용될 수도 있다.

backing store는 뷰의 컨텐츠를 캐싱한다는 의미이다.

레이어의 주요한 임무는 개발자가 제공하는 시각적인 컨텐츠를 관리하는 것이지만 동시에 레이어 스스로가 가지고 있는 시각적인 속성들도 있다.

배경색이나 테두리 관련 속성, 그림자 속성
이를 위해서 레이어는 컨텐츠의 위치, 사이즈, 변형 정보들을 보관한다. 이 정보들을 변경하면 애니메이션이 된다.

레이어는 효과적으로 뷰와 애니메이션을 보여주기 위한 인프라를 제공해주는 것이고 이벤트를 받거나, 직접 컨텐츠를 그리거나, 리스폰더 체인에 참여하는게 불가능하다. 또한 view에서 컨텐츠를 그리면 메인스레드에서 CPU로 draw 메서드를 처리하기 때문에 비용이 크지만 layer는 GPU를 사용하기 때문에 비용이 크지 않다.

UIWindow 객체의 역할은 무엇인가?

UIWindow는 사용자 인터페이스에 배경(backdrop)을 제공하고, 중요한 이벤트 처리 행동(behaviors)을 제공하는 객체입니다.
Windows는 자신의 시각적 모습(visual appearance)을 가지고 있지 않지만, 앱 View의 프레젠테이션에 중요합니다.
스크린에 나타나는 모든 View는 Window로 묶여 있으며, 각 Window는 앱의 다른 View와 독립적입니다.
앱에서 받은 이벤트는 처음에는 해당 View개체로 라우팅되고, 해당 이벤트는 해당 View로 전달됩니다.
Windows는 Viewcontroller를 사용하여 방향 변경을 구현하고, 앱 작동의 기본요소인 다른 많은 작업을 수행합니다.
Windows는 앱의 기본요소이지만, 코드에서 최소한의 방식으로 상호작용합니다.

UIWindow는 UIView의 하위클래스이다.

UINavigationController 의 역할이 무엇인지 설명하시오.

  • Stack 기반의 container view controller 이고, 제공하는 navigation 인터페이스로 1개 이상의 view controller 를 관리할 수 있다.
  • Stack 기반이므로 최상단에 있는 하나의 view controller 만이 보여지게 되고 view controller 를 push 혹은 pop 을 통해 보여질 view controller 를 결정하게 된다.
  1. viewControllers: navigation controller 는 여러개의 view controller 를 관리할 수 있는 container view controller 이기 때문에 해당 navigation stack 에 쌓인 view controller 들을 배열 형태로 가지고 있습니다. 해당 배열은 push, pop 형태로 관리됩니다.
  2. navigationBar: 앱을 사용하다 보면 상단에 타이틀, 뒤로가기, 설정등 특정 영역에 UI 요소들이 배치된 경우를 볼 수 있는데, 해당 영역을 navigationBar라고 합니다. 해당 navigationBar 를 통해 굳이 UI를 추가하거나 세팅할 필요없이 해당 view controller 를 위한 UI를 설정할 수 있습니다.
  3. toolbar: 사파리 앱에서 흔히 아래쪽에 공유하기나 여러 버튼들이 모여있는 것을 볼 수 있는데, 이를 toolbar라고 합니다. 기본적으로 navigation controller 에서는 숨김처리 되어 있지만, 숨김을 해제하고 해당 영역을 설정할 수 있습니다.
  4. delegate: UITableViewDelegate 처럼 UINavigationController 에도 특정 Event에서 사용할 수 있는 delegate가 선언되어 있습니다. 보통 특정 view controller가 보여지거나, 이동간 애니메이션을 설정하기 위해 사용합니다.

TableView를 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드를 설명하시오.

tableView(:numberOfRowsInSection) -> Int : 섹션별 cell 개수를 리턴합니다.
tableView(
:cellForRowAt:) -> UITableViewCell : 반환할 TableViewCell을 정의합니다.

하나의 View Controller 코드에서 여러 TableView Controller 역할을 해야 할 경우 어떻게 구분해서 구현해야 하는지 설명하시오.

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 {
		// 구현
	}
}
  1. 테이블 뷰의 Tag를 등록, 비교해서 구분한다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
	switch tableView.tag {
		case 0:
			// 구현
		case 1:
			// 구현
		default: 
			break
	}
}

참고자료

0개의 댓글