
[iOS] View Update Cycle(2) - layout, constraints, display
2022. 11. 19. 16:57
iOS/iOS
지난 포스팅에서 Main Run Loop과 Update Cycle에 대해 알아보았다. 이 Update Cycle은 view들을 layout, constraints, display 하는 작업을 담당하였다. Auto Layout에서 이들은 3단계를 거치게 되는데 Constraints: 시스템은 모든 constraints를 계산하고 설정한다. Layout: View의 배치하고, subview를 배치한다. Display: 필요한 경우 다시 그린다. 이번 포스팅에서는 layout, constraints, display가 어떻게 진행되고, 어떠한 메서드들이 있는지 알아보자 Layout view들의 position과 size들을 의미한다. view들의 Layout 변화는 layoutSubViews() 메서드에서 진행..

[iOS] View Update Cycle(1)
2022. 11. 18. 15:01
iOS/iOS
오늘 포스팅에서는 View가 어떻게 그려지는지에 알아보자 View가 어떻게 알아보기 이전에 Main Run Loop과, Update Cycle에 대해 알 필요가 있는데, 이에 대해 먼저 알아보자. Main Run Loop 우선 Run Loop이란, input source와 timer source 라는 2종류의 이벤트를 처리하는 루프이다. (input source는 소켓, 키보드, 마우스, 터치 등의 입력 소스) 이는 Thread를 생성시 자동으로 생성이 되며, 실행 시키기 위해서는 직접 코드를 통해 실행을 해야한다. Main Run(event) Loop은, Main Thread에서 실행되는 Run Loop으로, UIApplicaion 객체에 의해 자동으로 실행된다. 즉, 일반 Run Loop가 다르게 직..

[Swift] Initializer(3) - required init?(coder:)
2022. 11. 10. 16:57
iOS/Swift
UIView와 UIViewController에서 designated Initializer를 정의하게 되면, 아래와 같은 에러를 보게된다. 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView' 이 required init?(coder:)에 대해서 알아보도록 하자! 에러가 나는 이유 UIViewController와 UIView는 NSCoding이라는 protocol을 채택하고 있는데, NSCoding protocol은 아래의 method를 구현하도록 한다. func encode(with coder: NSCoder) { } required init?(coder: NSCoder) { } 저번 포스팅에서 말했듯이, requir..

[Swift] Initializer(2) - Class Initializer의 상속
2022. 11. 10. 00:27
iOS/Swift
Default Initializer가 Compiler에 의해 제공되는 경우 우선, default initializer가 제공되기 위해서는! class 내부에 initializer가 구현되어 있지 않아야 한다. 또한, initializer를 구현하지 않기 위한 조건은 모든 저장 프로퍼티들이 초기화되어 있어야 한다. class A { var num1 = 1 var str: String? //nil로 초기화 } 위의 조건을 만족하였을 때, Compiler에 의해 Default initializer를 제공받게 되고, Super Class의 모든(convienence, required, designated) initializer를 상속! 받게 된다. class Person { var age: Int init(ag..

[Swift] Initializer(1)
2022. 11. 9. 18:56
iOS/Swift
Swift에서 initializer란 객체를 초기화 하는것으로 initializer가 끝나게 되면, 저장 프로퍼티가 모두 값을 가지고 있어야 한다. 또한, Swift에서의 initializer는 값을 return 하지 않는다! Default Initializer Default initializer란, parameter로 아무것도 전달하지 않는 Initializer이다. 만약, 객체의 모든 저장 프로퍼티가 값을 가지는 경우 default initializer가 제공이 된다. class A { var num: Int init(){ self.num = 10 } } class B { var num: Int? let num2 = 10 } let a = A() //구현한 default initializer let ..

[iOS] App Life Cycle(3) - AppDelegate
2022. 11. 1. 21:06
iOS/iOS
Xcode에서 프로젝트를 생성하게 되면, AppDelegate.Swift 파일에 아래와 같이 선언된 것을 볼수가 있다. @UIApplicationMain//Swift 5.3이전 class AppDelegate: UIResponder, UIApplicationDelegate { ... } @main//Swift 5.3이전 class AppDelegate: UIResponder, UIApplicationDelegate { ... } 우선, 이 @UIApplicationMain과 @main에 대해서 알아보자! 기존의 C언어를 사용해 봤다면, main 함수를 통해 앱의 시작점을 알렸었던 경험이 있을 것이다. 하지만, Xcode에서 iOS 프로젝트를 생성하게 되면, main함수를 찾아볼수가 없는데, 이는, UIK..

[iOS] App Life Cycle(2) - App based VS. Scene based
2022. 11. 1. 20:07
iOS/iOS
지난 포스팅에서 알아보았듯이 MultipleWindow를 지원하면서 SceneDelegate가 등장하였고, AppDelegate UI LifeCycle을 관리하지 않게 되었다. 이에 따라 Life Cycle도 App-Based Life Cycle 에서 Scene-Based Life Cycle로 바뀌게된다. App State Life Cycle에 대해 알아보기 이전에 먼저 App State들은 무엇이 있는지 알아보자! Not Running : 앱이 아예 실행되지 않았거나, 시스템에 의해 완전히 종료된 상태 Inactive : 앱이 실행중이거나 아무 이벤트를 받지 못하는 상태 앱을 실행중에 전화가 왔거나, 메시지, 알림같은 interrupt 발생시 다른 상태로 넘어가기 전에 앱은 이상태를 거치게된다 Acti..

[iOS] App Life Cycle(1) - Multiple Windows in iOS
2022. 10. 19. 00:22
iOS/iOS
Apple은 WWDC19를 통해 iOS13이후부터 Multiple Window를 제공하게 되었다.Multiple Window를 위해 Scene이라는 개념이 추가가 되면서, 기존의 AppDelegate도 변하게 되고,SceneDelegate가 새롭게 등장하게 되었다.앞으로 여러 포스팅에 걸쳐서 Application의 Life Cycle을 알아보고자 한다.우선, 이번 포스팅에서는 UIWindow와 UIScene의 개념을 간략히 알아보고,어떤 방식으로 Multiple Window를 제공하는지 알아보고자 한다. UIWindow UIWindow란, View들을 담고 있는 컨테이너이다. 특별한 경우를 제외하고선, 하나의 Window만 생성하고,View가 바뀔 시에는 Window가 바뀌는 것이 아닌! Wind..
[Swift] KVO, Delegate and Notification
2022. 10. 8. 22:07
iOS/Swift
KVO Delegate Notification 앞서 3개의 post에서 KVO, Delegate, Notification에 대해서 알아보았다. 실제로 Applicatoin에서, 객체간의 interaction이 필요한 경우가 많다. 하지만 interaction을 위해 객체간의 종속되는 것은 "재사용성", "독립적인 기능요소"로의 가치를 잃게 된다! 예시로, ViewController는 특정 View를 관리하는 것이 아닌, 다른 ViewController에 종속되어 동작하는 것은 독립적인 기능요소의 가치를 잃게 된다. 이러한 interaction을 위해 excessive coupling(과도한 결합) = 종속 없이 event를 전달 및 처리 하기 위해 3가지 pattern을 사용한다. 이번 포스트에서 이 3..

[Swift] Notification
2022. 10. 8. 21:03
iOS/Swift
Notifications은 Cocoa의 Pub-Sub Pattern중 하나로, broadcast 방식으로 여러 객체에 이벤트를 전달 할 수 있다. 동작부터 알아보자면event를 보내는 Object는 Notification 객체를 만들어 post한다이 Notification 객체는 NotificationCenter로 가게 된다. 해당 event를 받고 싶은 객체는 Observer를 통해 NotificationCenter에 등록한다. NotificationCenter는 등록된 객체에게 broadcast방식으로 Notificatoin 객체를 보낸다. Notification Object앞서 살펴보았듯이, event를 보내기 위해서는 Notification 객체를 생성 해야 한다. Notification 은 ..

[Swift] Delegate
2022. 10. 7. 17:22
iOS/Swift
Delegate란, 한국말로 위임이란 뜻이며, 한 object가 해야되는 행위를 다른 object로 위임(대신)하는 pattern 이다. iOS에서 delegate는 protocol로 구현이 된다. 우선, 이 protocol에 대해 간단히 살펴 보자 Protocol protocol은 정의를 하고 제시를 할 뿐 기능을 구현하지는 않는 하나의 타입이다. struct나, class는 이를 상속하는 것이 아닌 채택한다는 표현을 쓴다. 쉽게 말하자면, Protocol은 하나의 행동 규범 혹은 틀 이라고 생각하면 된다. 음식점을 가지고 예시를 들어보자! 기본적으로 음식점을 차리기 위해선 요리를 해야한다. 또한, 음식도 팔아야 한다 즉, 음식점을 protocol로 생각하자면, 요리를한다, 음식을 판다 ... 등등의 ..
[Swift] KVO (Key-Value-Observing)
2022. 10. 6. 17:20
iOS/Swift
KVO란, Object의 properties의 변경을 다른 Object에 알리기 위한 Cocoa programming pattern NSObject를 상속한 Object에서만 KVO 사용가능하다. 또한, NSObject에 KVO를 위한 기본적인 methods가 잘 구현되어 있기 때문에 Override 할 필요가 없다. KVO in Swift 우선, KVO를 사용하기 위해 NSObject를 상속 하여야 한다. 또한, Obeserve(관찰)할 property에 대해 @objc attribute와 dynamic modifier를 추가한다. class Address: NSObject { @objc dynamic var cityName: String init(cityName: String) { ... } } cl..