본문 바로가기

ios

(18)
[iOS] UIView Animation으로 애니메이션 구현하는 방법 특정한 시간 동안 한 개 혹은 그 이상의 뷰들의 변화에 애니메이션을 주는 것에 대해 알아보겠습니다. 오늘은 그 중에서도 타입 메소드로 선언된 UIView.animate 를 살펴보겠습니다. class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void) 파라미터 animations 에 원하는 속성의 최종값을 설정하면 현재값에서 최종값으로 변하는 애니메이션이 실행됩니다. UIView가 제공하는 속성중에서 애니메이션을 지원하는 속성은 다음과 같습니다. frame bounds center transform alpha backgroundColor 기본적인 구현 방법은 아래와 같습니다. let newFrame = CGR..
[iOS] 앱 실행시 일어나는 일들 (App Launch Sequence) 앱 기동시 어떤 작업들이 어떤 순서대로 실행되는지 알아보도록 하겠습니다. 앱을 실행하는 과정에는 복잡한 몇 가지 단계들을 거칩니다. 대부분은 UIKit이 자동으로 관리해줍니다. 앱이 실행되는 동안, UIKit 은 커스텀 작업들을 실행시키기 위한 Delegate 메소드들을 호출합니다. 아래의 그림은 앱이 실행될 때부터 초기화될 때까지의 과정들을 나타냅니다. 앱은 사용자가 명시적으로 실행하거나 시스템에 의해 암시적으로 실행됩니다. Xcode가 제공하는 main 함수는 UIKit의 UIApplicationMain() 함수를 호출합니다. (UIApplicationMain() 는 Int32 를 return하는 함수이지만 이 함수는 return을 절대 하지 않습니다.) UIApplicationMain() 함수는 U..
[iOS] Operation? Operation Queue? 작업을 객체로 만들어보자! 오퍼레이션(Operation)은 하나의 작업을 나타내는 객체입니다. 보통 오퍼레이션 클래스를 상속한 블록 오퍼레이션을 사용하거나 오퍼레이션 클래스를 서브클래싱하여 커스텀 오퍼레이션을 직접 구현합니다. 오퍼레이션을 사용할 때 얻는 이점 오퍼레이션 사이에 의존성을 추가하여 실행 순서를 제어할 수 있습니다. 실행 취소(cancel) 기능을 구현하고 컴플리션 핸들러(completion handler)를 추가하는데 필요한 API를 제공합니다. 오퍼레이션 상태를 감시할 때는 KVO를 활용하거나 오퍼레이션 클래스가 제공하는 속성을 사용합니다. 오퍼레이션의 특징 오퍼레이션은 Single-Shot Object 입니다. 즉, 실행이 완료된 인스턴스는 다시 실행할 수 없습니다. 동일한 작업을 반복해야하는 경우에는 매번 새로..
[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 뒤에 바로 써줍니다. 대부분의 경우, 열거형의 형식은 추론이 가능하기 때문에 열거형 이름은 생략이 가능합니다. 열거형 이름을 생략하여..
[iOS] 강한 참조 사이클 (순환 참조) 해결하기 2편 두 인스턴스가 서로를 참조할 경우 강한 참조 사이클이 발생하고 인스턴스가 메모리에서 정상적으로 해제되지 않는 것을 강한 참조 사이클 해결하기 1탄에서 확인하였습니다. 강한 참조 사이클(Strong Reference Cycle)이 발생하는 문제를 해결하기 위해 약한(weak) 참조와 비소유(unowned) 참조로 해결하였죠. 클로저(Closure)에서도 강한 참조 사이클이 발생할 수 있습니다. 클로저가 인스턴스를 캡처하고 인스턴스가 클로저를 강한 참조로 저장하고 있다면 인스턴스는 메모리에서 정상적으로 해제되지 않습니다. 이 경우에도 약한 참조나 비소유 참조를 통해 해결할 수 있습니다. 강한 참조 사이클이 발생하는 경우를 예시를 통해 살펴보겠습니다. class Car { var totalDrivingDist..
[iOS] 강한 참조 사이클 (순환 참조) 해결하기 1편 인스턴스를 사용하지 않는데도 메모리에서 해제 되지 않으면 메모리 누수(Memory Leak)가 발생합니다. 강한 참조 사이클(Strong Reference Cycle)에 의해 발생할 수 있으며 약한(Weak) 참조와 비소유(Unowned) 참조를 통해 해결할 수 있습니다. 강한 참조에 대한 자세한 설명은 ARC 란? 을 참고해주세요! 강한 참조 사이클은 순환 참조(Retain Cycle)라고도 불립니다. 예시를 통해 강한 참조 사이클이 발생하는 경우를 먼저 살펴보도록 하겠습니다. class Person { var name = "John" var apartment: Apartment? deinit { print("Person deinit") } } class Apartment { var address: S..
[iOS] ARC 란? (Automatic Reference Counting) 앱의 성능을 유지하기 위해서는 메모리 관리가 기본이자 필수적 입니다. 그렇기 때문에 코코아(Cocoa)에서 사용하는 메모리 관리모델을 이해할 필요가 있습니다. 바로 MRC와 ARC 2가지 관리 모델입니다. Cocoa란? 애플에서 제공하는 어플리케이션 개발 환경을 의미합니다. macOS에서는 Cocoa, iOS에서는 Cocoa Touch 라고 부릅니다. 스택(Stack) 메모리에 저장된 데이터는 자동으로 제거되기 때문에 특별한 관리가 필요없습니다. 하지만 힙(Heap) 메모리에 저장된 데이터는 필요하지 않은 시점에 직접 제거해야만 합니다. 메모리 관리 모델은 힙에 저장된 데이터를 관리합니다. Value Type: Structure, Enumeration, Tuple Reference Type: Class,..
[iOS] GCD 활용하기 2편 (DispatchGroup, DispatchSemaphore) 동시에 실행되는 작업들을 관리하는 방법에 대해서 알아보겠습니다. 여러 작업을 하나의 그룹으로 관리하고 하나의 리소스에 대한 접근을 통제해야 하는 문제들을 GCD를 활용하여 해결해보겠습니다. DispatchGroup DispatchGroup 은 디스패치 큐에 추가된 작업을 가상의 그룹으로 관리합니다. 서로 다른 디스패치 큐에 추가된 작업을 동일한 그룹에 추가하는 것도 가능합니다. 여러 작업을 하나의 작업으로 묶는 것이라고 생각하면 편합니다. 그러므로 그룹에 포함된 모든 작업이 완료되어야 그룹이 완료됩니다. 예시를 통하여 그룹이 어떻게 사용되는지 알아보겠습니다. let queue1 = DispatchQueue(label: "ConcurrentQueue", attributes: .concurrent) let ..