ARC는 Swift의 메모리 관리기법이다.RC 즉, Reference Counting이라는걸 이용해 자신을 참조하고 있는 수를 계산해서 메모리에서 해제할지를 결정하는 방식인데..이번 글에서는 ARC에 대한 개념적인 내용은 생략하고, 실제 코드에서의 흐름을 조금 더 살펴볼 예정이다. 물론 자세한 코드는 뒤에서 볼 예정이지만, 흐름 중 다음과 같은 내용이 있었다."두 개의 클래스가 서로를 참조하고 있는 상황에서, 그 중 하나의 연결을 끊고, 해당 클래스를 참조하는 인스턴스에 nil을 할당해서 연결을 끊으면 모든 연결관계가 끊어져서 Deinit이 된다" 그런데 문득 이런 궁금증이 생겼다.왜 서로 물려있는 연결관계중에 하나만 끊어줘도 모든 연결관계가 끊어질까? 이러한 의문은 흐름을 천천히 살펴보면서 해결해보겠다..
(RxSwift를 사용하지 않고)MVVM 패턴을 사용할 때, 특정 객체의 변화를 감지하고 대응하기 위해 커스텀 Observable 클래스를 사용하곤 한다. Observable의 동작에 대해 간단히 설명하자면, 특정 값이 bind라는 메서드를 통해 closure라는 함수 타입의 프로퍼티에 전달이 되고, 그 값이 바뀔때 즉, didSet될 때 어떤 동작을 정의할 수 있다는 것인데......... 여기서 bind라는 함수가 존재하는 이유가 궁금해졌다.뒤에서 코드를 더 자세히 보겠지만, 사실 bind함수 없이 closure라는 프로퍼티 하나만으로도 충분히 의도한 동작을 할 수 있기 때문이다. 일단 Obsevable에 대해 간단히 알아보겠다.Observable의 컨셉과 구조MVVM 패턴에 대한 설명은 더 잘 정리..
일반적으로 더이상 상속되지 않을 class 앞에 `final`이라는 키워드를 붙이곤 한다.그렇게 하면 이 class는 더이상 상속되지 않을걸 알기에, 시스템의 입장에서 재정의를 위한 일련의 과정을 수행하지 않아도 되기 때문에 성능상에 이점이 있다고 알고 있었다. 그런데, 위의 문장으로는 뭔가 설명이 조금 부족해보인다.이번 글에서는 WMO와 Method Dispatch에 대한 설명과 함께 `final`을 붙이는 진짜 이유에 대해 알아보도록 하겠다.WMO: 전체 모듈 최적화xcode에 여러 개의 swift파일이 존재할 때 빌드를 하면, Swift는 각 파일을 개별적으로 컴파일한다.그런데 사실상 각각의 파일이 개별적으로 존재하는 경우는 잘 없다. 그러니까, 각 파일은 내부적으로 서로 연관이 있는 경우가 일반적..
동기와 비동기, 동시와 직렬은 Swift 공부를 하면서 한번쯤은 들어봤을 개념일 것이다.이번 글에서는 개념에 대해서는 간단하게만 짚고 넘어가고,다양한 상황에서 동기/비동기 그리고 동시/직렬처리를 했을때 출력 결과가 어떻게 나올지 예측하고, 정답여부를 체크해보겠다. 동기와 비동기 vs 동시와 직렬동기 VS 비동기동기와 비동기는 메인 쓰레드 관점에서의 구분이라고 생각하면 된다.- 동기(Sync): 여러 Task가 있을 때, 몇 개의 Task가 Queue로 보내졌다면, 메인쓰레드 입장에서 Queue로 보내진 Task가 끝날때까지 기다렸다가 다음 Task를 하는것.- 비동기(Async): Queue로 보내진 Task가 끝났는지의 여부와 상관없이, 바로 다음 Task를 진행하는 것동시 VS 직렬동시와 직렬은 Qu..
네트워크 통신 기능을 구현하는 경우 서버에서 온 응답값을 `completionHandler`를 통해 `@escaping`의 형태로 함수 밖으로 값을 빼내는 방식을 사용하게 된다.결국, 서버에서 온 응답값을 함수 밖에서 사용한다는 뜻인데 문득 이런 궁금증이 들었다."함수 밖으로 값을 뺀다는 것은 함수의 반환값으로도 할 수 있지 않을까?" 이번 글에서는 네트워킹 코드에서 반환값을 사용할 경우의 문제점과 함께 `@escaping 클로저`에 대해 알아보도록 하겠다.참고로 네트워킹 코드는 Alamofire를 기준으로 작성되었다.반환값으로 네트워킹 코드 작성시 문제점백문이 불여일견이라고, 원래 `completionHandler`와 `@escaping 클로저`를 통해 작성되어있는 네트워킹 코드를 작성해보겠다.아래 코..
HTTP 프로토콜을 이용해 서버와 통신하는 경우, 클라이언트쪽에서는 서버에서 받은 데이터를 가공해서 사용해야 한다.이 과정을 디코딩이라고 하는데, 보통 Swift에서 데이터를 받는 그릇으로 struct로 만드는 편이다.그러니까, 서버에서 String형태로 오는 데이터를 struct에 담아 가공해서 데이터를 사용하는 방식이라고 생각하면 된다. 그러다보니 이런 궁금증이 생겼다."왜 class가 아닌 struct로 받는거지?" 이번 글에서는 iOS의 네트워크통신과, struct/class의 차이점을 알아보겠다.iOS의 네트워크통신클라이언트가 서버에게 "이런 데이터 가져다줘!"라고하고, 서버가 해당 데이터를 응답으로 주는걸 보통 "네트워크 통신을 한다"고한다.이러한 정보 요청에 대한 기준을 API라고 하며, 그..