[Swift] Memory Leak(2) - Closure의 [weak self]
2022. 11. 26. 00:24
iOS/Swift
저번 포스팅에서 순환 참조와 ARC에 대해서 알아보았다. 이제 이러한 순환 참조가 실제로 일어나는 예시에 대해 살펴보자 Clousuer 우리는 흔히 클로져 에 [weak self] 키워드를 쓰는 것을 알 수 있다! 이것을 왜 사용하는 지 알아보기 전에 "Closure Capture"라는 것에 대해 알 필요가 있다. Closure Capture Closure는 주변 Context로 부터 상수나 변수를 Capture할 수 있는데, 먼저 예제를 살펴보자! func makeIncrementer(forIncrement amount: Int) { var runningTotal = 0 let closure = { runningTotal += amount print(runningTotal) } closure() clo..
[Swift] Memory Leak(1) - 약한 참조, 강한 참조, unowned 참조
2022. 11. 25. 18:03
iOS/Swift
이번 포스팅에서는 ARC와 메모리 누수가 언제 일어나는지 알아 보도록 하자 ARC ARC란 Automatic Reference Counting의 약자로, 말 그래도 Reference를 counting 하여, 자동으로 메모리를 관리 한다. 또한 Reference라는 키워드에서 볼 수 있듯이, 클로져나, 클래스와 같은 Reference 타입에 대해서만 관리 하며, enum, struct와 같은 Value 타입에 대해서는 관리하지 않는다. 이들은 retain 이라는 함수를 호출하여 Reference Count를 증가 시키고, release라는 함수를 호출하여 Reference Count를 감소 시킨다. 최종적으로 reference count가 0이 될때 자동으로 메모리에서 해제 해준다. class Person..
[RxSwift] RxSwift란?
2022. 11. 25. 01:37
iOS/RxSwift
Rx란, Reactive eXtension의 줄임말로, Observable(관찰 가능한) 시퀀스를 사용하여, 비동기식 프로그램 혹은 이벤트 기반 프로그램을 구성하기 위환 오픈 소스 라이브러리이다. 또한, 이런 관찰 가능한 시퀀스를 지원하기 위해 Observer 패턴을 사용한다. 아마 해당 문장의 이해가 쉽지 않을 것이다. 이제 이 문장을 천천히 이해해보자! 비동기 프로그래밍 네트워크 통신과 관련한 로직을 "동기적" 으로 짜게 되면, 아래와 같이 앱의 UI업데이트가 멈추는 현상을 발견할 수 있다. 이러한 이유 때문에, 비동기 프로그래밍이 중요한데, 위의 예시를 GCD와 Closure를 통해 비동기 방식으로 짜게 되면, func downLoadJson(_ url: String, _ completionHand..
[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(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가 바뀌는 것이 아닌! Wi..
[Swift] Notification
2022. 10. 8. 21:03
iOS/Swift
Notifications은 Cocoa의 Observer 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..