본문 바로가기

ios/swift27

Git Hooks에 SwiftLint 적용하기 개요 Git 훅은 Git 작업 흐름 중 특정 이벤트가 발생할 때 실행되는 스크립트이다. Git 훅은 클라이언트 훅과 서버 훅으로 나눌 수 있다. 클라이언트 훅은 커밋이나 머지 이벤트가 발생할 때 실행되고 서버 훅은 푸시할 때 실행된다. 기본적으로 Git은 .git/hooks에 있는 훅 스크립트를 사용한다. 기본 훅 디렉토리에는 Git이 기본으로 제공하는 훅이 있다. 기본 훅들은 sample 확장자를 가진 형태인데 sample확장자를 지우고 sh 명령어로 실행할 수 있다. pre-commit 훅에 SwiftLint 적용하기 pre-commit 훅은 커밋 과정 중 가장 먼저 호출되는 훅으로 커밋 전에 실행된다. 이 훅을 사용해 코드 스타일, 코드 포맷, 테스트 등을 자동으로 실행하여 커밋 전 개발자가 실수한.. 2023. 5. 15.
Main event loop와 Update cycle Main event loop 메인 이벤트 루프(Main event loop)는 메인 스레드의 런 루프이다. 메인 이벤트 루프는 애플리케이션이 시작될 때 생성된 애플리케이션(UIApplication) 객체에 의해 자동으로 생성되고 실행된다. 런 루프는 두 가지 종류의 입력 이벤트를 받을 수 있는데 메인 이벤트 루프는 유저로부터 입력 소스(Input Source) 이벤트를 받는다. 메인 이벤트 루프는 다른 런 루프와 다르게 멈추지 않는다. 따라서 입력 이벤트 핸들링과 애플리케이션의 상태와 뷰 업데이트를 계속해서 처리한다. 운영체제(iOS)는 유저로부터 입력받은 저 수준의 이벤트를 도착한 순서대로 이벤트 큐(Event Queue)에 넣는다. 애플리케이션 객체는 이벤트 큐에서 이벤트를 한 개 뽑아 이벤트가 발생.. 2023. 1. 31.
[WWDC 2021] ARC in Swift: Basics and beyond Automatic Reference Counting in Swift 스위프트의 참조 타입 인스턴스는 힙 메모리에 저장되고 Automatic Reference Counting (or ARC) 방식으로 관리된다. ARC 방식은 단순한데 어떤 한 참조 타입의 인스턴스는 refCount라는 참조값을 가지고 이 인스턴스가 참조되면 참조값을 늘리고 더 이상 참조되지 않으면 참조값을 줄인다. 만약 참조값이 0이 되면 인스턴스의 생명이 끝난 것으로 판단하여 메모리에서 해제한다. ARC 스위프트의 인스턴스는 생성자를 통한 초기화부터 마지막 사용될 때까지 메모리 위에 있다. 인스턴스의 참조 여부를 수동으로 계산해 retain 연산과 release 연산을 추가해야 하는 Objective-C의 Memory Reference .. 2023. 1. 31.
Run Loop Run Loop란 런 루프(Run loop)는 스레드에 전달된 소켓, 파일, 키보드, 마우스 등의 입력과 타이머 객체를 처리하는 객체이다. 런 루프를 사용해 스레드의 활동 상태를 조정할 수 있으며 이것이 런 루프가 고안된 이유이다. 모든 스레드는 생성될 때 자신만의 런 루프를 갖는다. 메인 스레드에 생성된 메인 런 루프는 생성과 동시에 자동으로 실행(Start)되지만 그 외 스레드의 런 루프는 자동으로 실행되지 않는다. 따라서 개발자는 적절한 타이밍에 직접 런 루프를 실행시켜 이벤트를 처리해야 한다. 입력 이벤트의 종류 런 루프는 2가지 입력 이벤트를 받는다. Input source는 다른 스레드나 애플리케이션에서 비동기적으로 전달된 이벤트이다. Timer source는 예정된 시간 또는 반복된 Inte.. 2022. 11. 21.
Initialization (1) 초기화(Initialization) 인스턴스의 저장 프로퍼티는 사용하기 전에 반드시 특정 값 또는 nil로 초기화되어야 한다. 초기화(Initialization)는 클래스, 구조체, 열거형의 프로퍼티 초기 값을 설정하는 단계이다. 초기화 과정은 초기자(Initializer)를 정의해 구현할 수 있다. Struct Initializer 구조체의 초기자를 만드는 간단한 방법은 초기자 내부에서 저장 프로퍼티의 초기값을 지정해주는 방법으로 매개변수(parameter)가 없는 init 키워드를 사용하는 것이다. 저장 프로퍼티의 초기 값을 항상 미리 지정된 값으로 초기화한다. 만약 모든 저장 프로퍼티의 초기값이 설정되어 있고, 어떤 초기자도 정의하지 않았다면 스위프트는 모든 저장 프로퍼티를 초기값으로 초기화하는 기.. 2022. 11. 11.
Key-Value-Observing (KVO) Key-Value-Observing Key-Value-Observing (KVO)는 코코아 프로그래밍 패턴 중 한 개로 프로퍼티의 변화를 다른 객체에 알릴 때 사용할 수 있다. 애플리케이션의 뷰(View) 또는 모델(Model)의 프로퍼티 변화를 컨트롤러(Controller)에 알릴 때 유용하다. KVO는 프로퍼티가 변경될 때마다 알림을 보내기 위한 체계를 구현할 필요가 없다. 프로퍼티의 변경 사항이 생기면 관찰 객체에 직접 알림을 전달하기 때문에 NSNotificationCenter와 다르게 관찰자에게 변경 사항을 알리는 중앙 개체가 필요 없다는 것이 장점이다. NSObject를 상속할 때 KVO를 위한 기본적인 메서드가 NSObject에 이미 구현되어 있기 때문에 이러한 메서드를 오버라이드 할 필요도.. 2022. 10. 5.
Key-Value-Coding (KVC) Key-Value-Coding 많은 프로그래밍 언어에서 캡슐화된 객체의 프로퍼티 값을 얻거나 수정하기 위해서는 객체에 정의한 getter, setter 메서드를 통해 접근할 것이다. 아마 스위프트도 getter, setter 메서드 혹은 연산 프로퍼티 등 비슷한 방식으로 접근할 것이다. 이러한 객체의 프로퍼티에 직접적으로 접근과는 다르게 Objective-C와 스위프트는 Key-Value-Coding(KVC)를 통해 객체의 프로퍼티에 간접적으로 접근할 수 있다. Objective-C에서 KVC 방식을 사용하기 위해서는 객체가 NSKeyValueCoding 프로포콜을 채택해야 한다. 다행히도 프로토콜 메서드의 기본적인 구현이 되어 있기 때문에 따로 구현해야 하는 것은 없다. Identifying an Ob.. 2022. 10. 4.
클래스의 성능을 높이는 방법 정적 디스패치(Static Dispatch)와 동적 디스패치(Dynamic Dispatch) 스위프트는 C++, 자바 등 많은 언어들처럼 클래스 상속을 지원하고, 슈퍼 클래스를 상속한 서브 클래스에서 프로퍼티와 메서드 오버라이딩을 할 수 있다. 따라서 프로그램은 런타임 단계에서 동일한 이름의 메서드들 중 어떤 메서드를 실행시켜야 할지 결정해야 한다. 이 과정을 동적 디스패치(Dynamic Dispatch)라고 한다. 스위프트의 동적 디스패치는 기본적으로 vtable를 참조하는 간접 호출(Indirect Call)이다. 따라서 컴파일 단계에서 호출될 함수를 결정하여 직접 호출(Direct Call)하는 정적 디스패치(Static Dispatch) 보다 느리다. class A { var aProperty: .. 2022. 9. 28.