[iOS] TIL

Zoe·2023년 9월 19일
0

iOS

목록 보기
20/39

SceneDelegate

  • 앱의 UI 생명 주기를 관리
  • 이를 통해 iPadOS에서의 다중 윈도우 기능 등을 지원하기 위한 변경이 이루어진 것

함수:

  • scene(_:willConnectTo:options:): 씬이 생성되고 UI를 구성할 준비가 되면 호출.
  • sceneDidDisconnect(_:): 씬이 연결 해제되면 호출.
  • sceneDidBecomeActive(_:): 씬이 활성화 상태가 되면 호출.
  • sceneWillResignActive(_:): 씬이 비활성화 상태가 될 때 호출.
  • sceneWillEnterForeground(_:): 씬이 포그라운드로 진입할 때 호출.
  • sceneDidEnterBackground(_:): 씬이 백그라운드로 이동할 때 호출.

왜 SwiftUI에서는 사용하지 않는지:

SwiftUI는 선언적 UI 프레임워크로서, UI 및 그 생명 주기를 선언적으로 정의. 따라서 SwiftUI 앱은 @main 어노테이션을 사용하여 앱의 진입점을 정의하며, 전통적인 AppDelegate 및 SceneDelegate 구조를 사용하지 않습니다. SwiftUI의 App 프로토콜은 Scene 프로토콜을 사용하여 UI 및 생명 주기 이벤트를 직접 관리하므로, 별도의 SceneDelegate가 필요하지 않다.

UIApplication 객체의 컨트롤러 역할 구현 장소

UIApplication 객체의 컨트롤러 역할은 AppDelegate에서 구현해야 한다. AppDelegate는 앱의 전반적인 생명 주기, 설정, 및 기타 시스템 레벨의 이벤트를 관리하는 곳이기 때문에, UIApplication 객체와 밀접하게 연관되어 있다. 이러한 이유로, 앱이 시작되거나 종료될 때, 앱이 활성화되거나 비활성화될 때와 같은 주요한 상황에서 발생하는 이벤트를 처리하기 위한 메소드들이 AppDelegate에 정의되어 있다.

UI Framework

  • uikit
  • swiftui
  • Foundation은 UI와는 직접적으로 관련이 없는 데이터 및 기능적인 부분
    기본 데이터 타입: NSNumber, NSString, NSData, NSDate, NSValue 등.
    컬렉션 타입: NSArray, NSDictionary, NSSet, NSHashTable, NSMapTable 등.
    파일 및 디렉터리 관리: FileManager, NSURL, NSPathUtilities 등.
    날짜 및 시간: NSDate, NSCalendar, NSDateFormatter 등.
    타이머: NSTimer.
    런타임 지원: NSObject, NSProxy 등.
    기타 유틸리티: NSOperation, NSThread, NSRunLoop, NSRegularExpression, NSNotification, NSNotificationCenter 등.
    네트워킹: NSURLRequest, NSURLSession, NSURLConnection 등.
    기타 많은 클래스들...

Delegate

Delegate는 디자인 패턴 중 하나로, 특정 객체가 다른 객체의 행동에 영향을 주거나 그 행동을 확장하거나 수정할 수 있도록 하는 메커니즘을 제공한다. 특히 iOS와 macOS의 프로그래밍에서는, 객체 간의 커뮤니케이션을 위해 delegate 패턴을 널리 사용한다. 예를 들어, UITableView에서는 스크롤이나 셀 선택 같은 사용자의 액션을 처리하기 위해 UITableViewDelegate를 사용한다.

Delegate는 일반적으로 weak 참조로 선언된다. 이는 delegate에 대한 순환 참조를 피하기 위함이다. 순환 참조는 두 객체가 서로를 강하게 참조하게 되어 메모리에서 해제되지 않는 문제를 일으킬 수 있다. 따라서 delegate를 weak로 선언함으로써, delegate를 사용하는 객체가 메모리에서 해제될 때 delegate에 대한 참조도 자동으로 nil이 되어 순환 참조의 위험을 회피한다.

NotificationCenter

  • iOS와 macOS에서 제공하는 옵저버 패턴의 한 형태

  • 특정 이벤트나 행동에 대한 알림을 받기 원하는 객체들에게 알림을 전달하는 중앙 허브 역할

  • 등록: 객체는 특정 알림을 수신하고자 할 때 NotificationCenter에 등록(observe)한다. 이 때, 어떤 알림을 관찰할 것인지, 그리고 해당 알림이 도착했을 때 호출될 메소드나 클로저를 지정한다.

  • 발송: 어떤 이벤트나 조건이 발생했을 때, 해당 알림을 발송(post)하는 코드가 NotificationCenter를 통해 해당 알림을 전송한다.
    응답: 등록된 객체들은 해당 알림을 받게 되고, 미리 지정된 메소드나 클로저를 통해 응답하게 된다.

  • 삭제: 객체가 더 이상 특정 알림을 관찰할 필요가 없을 경우, NotificationCenter에서 해당 알림의 등록을 취소한다.

  • UI 업데이트: 데이터 모델이 변경되었을 때, UI를 업데이트하는 데 사용할 수 있다. 예를 들어, 데이터가 백그라운드에서 업데이트되었을 때 그에 따라 테이블 뷰를 새로 고칠 필요가 있다면, NotificationCenter를 사용하여 업데이트 알림을 전달하고 UI를 새로고침 할 수 있다.

  • 상태 변화 반응: 앱의 다양한 상태 변화(네트워크 연결 상태, 사용자 인증 상태 등)에 대해 응답하는 로직을 구현할 때 사용한다.

  • 키보드 관련 이벤트: 키보드가 나타나거나 사라질 때 UI를 조절하기 위한 알림으로 사용한다.

  • 생명주기 관련 알림: 앱이 백그라운드로 전환되거나 포그라운드로 오를 때 등의 생명주기와 관련된 이벤트에 응답할 때 활용한다.

  • 다른 컴포넌트와의 통신: 서로 다른 컴포넌트나 모듈이 직접적으로 연결되지 않은 상태에서 통신할 때 유용하게 사용할 수 있다.

Foundation kit

  • Apple의 프레임워크 중 하나

main thread

UIKit 클래스들을 다룰 때, 꼭 메인 쓰레드에서 처리해야 한다.
다른 백그라운드 쓰레드에서 UIKit 객체를 직접 수정하면 예기치 않은 동작이나 앱 충돌을 일으킬 수 있다.

UI 관련된 작업은 main thread에서 해야한다.
동시성 제어: 여러 쓰레드가 동시에 UI 요소에 액세스하려 할 때 충돌을 방지하기 위해.
예측 가능한 사용자 경험: UI 업데이트는 순차적이고 일관되게 처리되어야 사용자에게 일관된 경험을 제공

언제 사용하는지:
메인 쓰레드는 다음과 같은 경우에 사용:

UI 업데이트: 화면에 표시되는 요소의 변경, 애니메이션, 전환 등.
사용자 입력 처리: 버튼 탭, 스크롤, 제스처 등 사용자의 액션 처리.
시스템 이벤트 응답: 알림, 생명주기 이벤트 (예: viewDidLoad, viewWillAppear 등) 처리.

SwiftUI에서의 사용:

백그라운드 작업 후 UI를 업데이트해야 하는 경우 메인 쓰레드에서 이를 수행

DispatchQueue.global().async {
    // 백그라운드에서의 작업
    let data = fetchData()

    DispatchQueue.main.async {
        // 메인 쓰레드에서의 UI 업데이트
        self.myData = data
    }
}

app bundle

1. 구조

앱 번들은 .app 확장자를 가진다. 번들 내부에는 다음과 같은 주요 파일과 디렉터리들이 위치한다:

Info.plist: 애플리케이션의 메타데이터와 설정 정보를 포함하는 파일이다. 앱 ID, 지원되는 디바이스 방향, 애플리케이션 버전 등의 정보가 포함되어 있다.
Executable file: 애플리케이션의 실행 파일이다. 이 파일의 이름은 대개 애플리케이션 이름과 동일하다.
Resources: 이미지, 사운드 파일, 스토리보드, NIB/XIB 파일 등의 애플리케이션 리소스가 이 폴더 안에 저장된다.
Frameworks: 애플리케이션에 포함된 외부 프레임워크나 라이브러리가 저장되는 디렉터리다.
CodeSignature: 애플리케이션의 디지털 서명 정보가 포함된다.
embedded.mobileprovision: 애플리케이션의 프로비저닝 프로파일이다. (앱스토어 배포나 특정 디바이스에 설치를 위해 필요한 정보를 포함)
PkgInfo: 애플리케이션의 유형과 크리에이터 코드를 담고 있는 간단한 파일이다.
Base.lproj, en.lproj, ko.lproj, ...: 언어별 리소스가 저장된 폴더다. 각 폴더 내에는 해당 언어에 대한 번역된 문자열이나 리소스들이 포함된다.
Assets.xcassets: 이미지나 아이콘, 색상 등의 애플리케이션 리소스를 관리하는 곳이다.

2. 역할

앱의 패키징: 모든 리소스, 실행 파일, 설정을 하나의 패키지로 묶어 관리한다. 따라서 앱을 설치하거나 이동할 때는 번들 전체를 복사하거나 이동하면 된다.
리소스의 관리: 앱 실행 시 필요한 이미지나 사운드 같은 리소스를 불러올 때, 앱 번들에서 해당 리소스를 찾아 사용한다.
앱 정보의 제공: 앱에 관련된 정보나 설정 값을 저장하고 제공한다.

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

모든 View Controller 객체의 상위 클래스는 UIViewController이다.

면 관리: 애플리케이션의 사용자 인터페이스를 구성하고 관리하는 데 중심적인 역할을 한다. 한 화면을 나타내거나 화면 간의 전환을 관리하는 것은 대개 UIViewController의 책임이다.
라이프사이클 관리: UIViewController는 뷰 컨트롤러의 라이프사이클과 관련된 여러 이벤트를 처리한다. 예를 들어, viewDidLoad(), viewWillAppear(:), viewDidAppear(:), viewWillDisappear(:), viewDidDisappear(:)와 같은 메서드들을 통해 뷰 컨트롤러의 생명주기 중 특정 시점의 이벤트를 처리할 수 있다.
데이터 전달: 뷰 컨트롤러 간에 데이터를 전달하거나 받아오는 역할을 할 수 있다.
사용자 입력 처리: 버튼 탭, 제스처 인식, 텍스트 입력 등 사용자의 인터랙션을 처리한다.
자식 뷰 컨트롤러 관리: UIViewController는 컨테이너 뷰 컨트롤러로서 다른 뷰 컨트롤러들을 자식으로 포함하고 관리할 수 있다. 이를 통해 화면의 일부분을 독립적으로 관리하거나 화면 전환 등의 로직을 구현한다.
레이아웃 및 애니메이션: UIViewController는 뷰와 그 하위 뷰의 레이아웃을 정의하고 필요한 애니메이션을 적용할 수 있다.
리소스 관리: 뷰 컨트롤러가 더 이상 사용되지 않을 때, 메모리와 관련된 리소스를 해제하는 것도 UIViewController의 역할 중 하나다.

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

1. UIKit

  • 뷰 클래스 정의: UIView를 상속받는 새로운 클래스를 만든다.
class CustomView: UIView {
    // ...
}
  • 초기화 메서드 구현: 필요한 초기화 로직을 init 메서드에서 설정한다. 프로그래밍 방식으로 뷰를 초기화하려면 init(frame:)을, Interface Builder에서 초기화하려면 init(coder:)를 재정의한다.
override init(frame: CGRect) {
    super.init(frame: frame)
    setupView()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    setupView()
}

private func setupView() {
    // 커스텀 뷰 초기화 로직
}
  • 레이아웃 및 그리기: layoutSubviews나 draw(_:) 메서드를 재정의하여 레이아웃이나 사용자 정의 그리기를 구현한다.
  • Interface Builder 사용: .xib 파일을 사용하여 뷰를 디자인하고 코드와 연결할 수도 있다.

2. SwiftUI

  • 뷰 프로토콜 준수: View 프로토콜을 준수하는 새로운 구조체를 만든다.
struct CustomView: View {
    // ...
}
- body 구현: body 계산 프로퍼티를 제공하여 뷰의 내용을 정의한다.
var body: some View {
    // 뷰의 내용
}
  • 뷰 컴포넌트 조합: SwiftUI의 기본 뷰와 뷰 수정자를 조합하여 사용자 정의 뷰를 구성한다.
  • 데이터 바인딩: @State, @Binding, @ObservedObject 등의 프로퍼티 래퍼를 사용하여 뷰와 데이터를 바인딩한다.

View

1. UIKit

UIView: UIKit의 모든 UI 구성 요소의 기본이 되는 클래스다. 버튼(UIButton), 레이블(UILabel), 슬라이더(UISlider) 등의 위젯은 모두 UIView를 상속받아 만들어진다.
역할: UIView는 화면의 사각형 영역을 차지하며, 그 위에 그래픽 콘텐츠를 그린다. 또한 이벤트 처리(터치, 제스처 등)를 담당한다.
레이아웃: UIView는 Auto Layout과 Core Animation과 같은 시스템과 밀접하게 통합되어 있어, 뷰의 크기, 위치, 애니메이션 등을 관리한다.
계층 구조: UIView는 계층적인 구조를 가진다. 즉, 하나의 뷰는 여러 개의 자식 뷰를 포함할 수 있고, 각각의 자식 뷰도 자신의 자식 뷰를 가질 수 있다.

2. SwiftUI

View 프로토콜: SwiftUI의 UI 구성 요소는 View 프로토콜을 준수한다. 이 프로토콜을 준수하는 것은 UIKit의 UIView와는 다른 개념으로, 여기서는 UI의 "설명" 또는 "선언"을 제공하는 역할을 한다.
역할: SwiftUI의 View는 UI의 특정 상태를 기반으로 어떻게 보여져야 하는지를 선언한다. 이는 "선언적" UI 프로그래밍 패러다임을 따르는 것이다.
레이아웃: View의 레이아웃과 배열은 뷰 수정자와 컴비네이터를 통해 결정된다. 예를 들어, stack, padding, frame과 같은 수정자들을 통해 뷰의 크기와 위치를 정의할 수 있다.
컴포지션: SwiftUI의 View는 재사용 가능하고 조합 가능한 구성 요소로 설계되었다. 따라서 작은 뷰를 만들고 이를 조합하여 복잡한 UI를 구성하는 방식을 취한다.

profile
iOS 개발자😺

0개의 댓글