본문 바로가기

전체 글

(44)
[iOS] 앱 실행시 일어나는 일들 (App Launch Sequence) 앱 기동시 어떤 작업들이 어떤 순서대로 실행되는지 알아보도록 하겠습니다. 앱을 실행하는 과정에는 복잡한 몇 가지 단계들을 거칩니다. 대부분은 UIKit이 자동으로 관리해줍니다. 앱이 실행되는 동안, UIKit 은 커스텀 작업들을 실행시키기 위한 Delegate 메소드들을 호출합니다. 아래의 그림은 앱이 실행될 때부터 초기화될 때까지의 과정들을 나타냅니다. 앱은 사용자가 명시적으로 실행하거나 시스템에 의해 암시적으로 실행됩니다. Xcode가 제공하는 main 함수는 UIKit의 UIApplicationMain() 함수를 호출합니다. (UIApplicationMain() 는 Int32 를 return하는 함수이지만 이 함수는 return을 절대 하지 않습니다.) UIApplicationMain() 함수는 U..
[iOS] Xcode 빌드 시간 줄이는 방법 느려지는 컴파일 타임을 좋아하는 사람은 아무도 없을 것입니다. 컴파일 타임은 개발 속도에도 꽤나 큰 영향을 끼칩니다. 이번에는 컴파일 타임을 조금이나마 향상시키는 방법에 대해 알아보도록 하겠습니다. 1) 컴파일 타임을 정확하게 측정해보기 컴파일 타임을 개선하기 위해서는 먼저 프로젝트가 얼마나 컴파일 시간이 소요되는지 알아야 합니다. 컴파일 타임을 측정하기 위해서 아래의 명령어를 터미널에 입력합니다. defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES 샘플 프로젝트를 통해 측정한 시간을 살펴보겠습니다. 컴파일 종류 컴파일 시간 일반 빌드 0.025s 클린 빌드 2.636s 초기화 빌드 6.032s 일반 빌드는 시간이 매우 짧습니다. 수정된 파..
[iOS] Operation? Operation Queue? 작업을 객체로 만들어보자! 오퍼레이션(Operation)은 하나의 작업을 나타내는 객체입니다. 보통 오퍼레이션 클래스를 상속한 블록 오퍼레이션을 사용하거나 오퍼레이션 클래스를 서브클래싱하여 커스텀 오퍼레이션을 직접 구현합니다. 오퍼레이션을 사용할 때 얻는 이점 오퍼레이션 사이에 의존성을 추가하여 실행 순서를 제어할 수 있습니다. 실행 취소(cancel) 기능을 구현하고 컴플리션 핸들러(completion handler)를 추가하는데 필요한 API를 제공합니다. 오퍼레이션 상태를 감시할 때는 KVO를 활용하거나 오퍼레이션 클래스가 제공하는 속성을 사용합니다. 오퍼레이션의 특징 오퍼레이션은 Single-Shot Object 입니다. 즉, 실행이 완료된 인스턴스는 다시 실행할 수 없습니다. 동일한 작업을 반복해야하는 경우에는 매번 새로..
[Swift] Computed Property 는 언제 쓰는지 알아보자 Computed Property를 직역하면 계산된 속성이 됩니다. 하지만 수학적 계산이 실행된다는 의미는 아닙니다. 다른 속성을 기반으로 해당 속성 값이 결정된다는 의미입니다. 저장 속성(Stored Property)은 값을 저장할 메모리 공간을 가지고 있습니다. 반면에, 연산 프로퍼티(Computed Property)는 메모리 공간을 가지지 않습니다. 다른 속성에 저장된 값을 읽어서 필요한 계산을 실행한 다음 반환(return)하는 것입니다. 또한 연산 프로퍼티에 값을 할당하는 것은 속성으로 전달된 값을 다른 속성에 저장하는 것입니다. 이런 특징 때문에 속성에 접근할 때마다 다른 값이 반환될 수 있습니다. 그러므로 연산 프로퍼티는 let이 아닌 var로 선언해야합니다. 저장 속성은 클래스, 구조체에만 ..
[Swift] lazy var ? Lazy Stored Property 에 대하여 지연 저장 속성 (Lazy Stored Property) 은 인스턴스가 초기화 되는 시점이 아니라 속성에 처음 접근하는 시점에 초기화됩니다. lazy 키워드를 사용하여 선언하는 방법은 아래와 같습니다. lazy var name: Type = DefaultValue 초기화 시점이 지연되기 때문에 몇 가지 제한이 있습니다. 인스턴스가 초기화된 이후에 지연 저장 속성은 개별적으로 초기화가 됩니다. 그렇기 때문에 변수(lazy var)가 아닌 상수(lazy let)로 선언은 불가능 합니다. 또한 생성자에서 초기화 하지 않기 때문에 선언 시점에 기본값을 저장해주어야 합니다. 이미지를 저장하는 구조체 예제를 살펴보겠습니다. struct Image { init() { print("New Image") } } 예제이므..
[Swift] Namespace 네임스페이스 란? (Struct, Enum 활용) 다른 라이브러리, 프레임워크와 이름이 충돌되지 않기 위해 Objective-C 클래스에는 고유한 이름이 있습니다. 애플이 UIView, CGRect, CALayer 와 같이 Objective-C 클래스에 접두어를 사용하는 이유입니다. 하지만 스위프트 모듈은 클래스 접두사가 필요하지 않습니다. 스위프트는 현재 모듈 내의 네임스페이스(Namespace) 유형과 상수에 대한 솔루션을 제공하지 않고 있습니다. 스위프트로 작업할 때 일반적인 문제는 프로젝트를 함께 진행하는 개발자 누구나 쉽게 이해하는 방식으로 상수를 정의하는 것입니다. Objective-C 에도 유사한 고민이 있습니다. 모든 상수에는 이름 충돌을 피하기 위해 두 개 또는 세 개의 글자가 앞에 붙고 용도를 설명합니다. NSString * const..
[Swift] Enum 열거형 정복하기 2편 (Enum Case Pattern) 연관값(associated values)을 가진 열거형(enumeration)의 case를 매칭시킬 때 이 패턴을 사용합니다. switch 문, if 문, guard 문, for-in 문, while 문에서 모두 사용이 가능합니다. 기본적인 문법을 먼저 살펴보도록 하겠습니다. case Enum.case(let name): case Enum.case(var name): 각 케이스의 연관값은 상수나 변수로 바인딩이 가능합니다. case let Enum.case(name): case var Enum.case(name): 바인딩 방식이 동일하다면 let, var 키워드를 case 뒤에 바로 써줍니다. 대부분의 경우, 열거형의 형식은 추론이 가능하기 때문에 열거형 이름은 생략이 가능합니다. 열거형 이름을 생략하여..
[Swift] Enum 열거형 정복하기 1편 (Raw, Associated Values) 열거형(Enumeration)은 연관된 값들의 집합을 공통된 타입으로 정의하는 것입니다. 열거형은 type-safe 하게 코딩할 수 있는 방법이죠. 주로 요일과 같이 한정된 경우의 수를 정의할 때 사용합니다. 기본적인 문법은 아래와 같습니다. enum Name { case firstCase case secondCase } 열거형의 이름은 주로 단수형을 사용합니다. C나 Objective-C와는 다르게 각 case 에 기본적인 정수값(0, 1, 2 ...)이 할당되지는 않습니다. Raw Values 열거형의 case 는 모두 독립적인 값이지만 내부에 또 다른 값을 저장할 수 있습니다. 이것을 원시값(raw value)이라고 합니다. 열거형을 정의할 때 원시값 저장은 필수사항이 아닙니다. 직접 만든 열거형에..