iOS
-
[UIKit] UITableViewCell 재사용에 대한 실험iOS/UIKit 2022. 8. 23. 23:15
tableview cell의 lifetime 생성 -> 큐에 들어감 -> readyforreuse -> 보임 모든 index에 대해서 셀을 생성하지 않고, 만들어진 셀을 공유함으로써 메모리를 절약할 수 있습니다. 이때 아무리 디버거로 메모리를 들여다봐도 reuseQueue에 어떤 인스턴스가 들어가 있는지 확인할 수 없어서 직접 실험을 통해서 알아봤습니다. 즉 tableviewcell이 어떤 방식으로 재활용되는지 알아보는 간접적인 실험입니다. 제일 처음에는 위와 같이 화면에 보이는 셀들만 생성이 됩니다. 0번째 셀이 완벽하게 들어가지 않은 상황입니다. reuseQueue에 아무것도 없기 때문에, 새로운 cell이 생성됩니다. 이제 0번째 셀이 완벽하게 가려졌습니다. 그렇다면 0번째 셀은 reuseQueue..
-
[Swift] Generic에서 Method DispatchiOS/Swift 2022. 8. 22. 20:17
iOS 개발자라면 꼭 시청해야 한다고 생각하는 WWDC 세션인 Understanding Swift Performance의 내용 중 Generic code 파트에 대해서 공부하며 적은 글입니다. 출처는 알아보기 쉽도록 각 단락마다 적어놓았습니다. Generic Generic code는 더욱 정적인 형태의 polymorphism을 구현할 수 있도록 도와줍니다. 이것을 parametric polymorphism이라고도 부릅니다. "One type per call context" (protocol을 이용했을 때에는 struct를 사용하더라도 메서드가 동적으로 결정되는 부분이 있었는데, generic은 그게 아니라는 뜻인 것 같습니다.) 이제부터 위에 한 말이 무슨 뜻인지 알아보겠습니다 Generic으로 만들어진..
-
[Swift] Protocol에서 Method dispatchiOS/Swift 2022. 8. 21. 19:31
iOS 개발자라면 꼭 시청해야 한다고 생각하는 WWDC 세션인 Understanding Swift Performance의 내용 중 Protocol types 파트에 대해서 공부하며 적은 글입니다. 출처는 알아보기 쉽도록 각 단락마다 적어놓았습니다. Polymorphism with struct polymorphic code를 struct로 작성하는 방법은 무엇일까요? 영상에서는 POP(Protocol oriented programming)이라고 답합니다. 그렇다면 protocol을 사용할 때 method dispatch가 어떻게 동작하는지도 알아야 할 것입니다. 이번에는 이전의 예시에서 부모 클래스를 protocol로 바꿨습니다. 각 struct는 protocol을 채택하여 구현했고, 때문에 상속관계가 없..
-
[Swift] Method dispatch와 V-TableiOS/Swift 2022. 8. 20. 22:11
iOS 개발자라면 꼭 시청해야 한다고 생각하는 WWDC 세션인 Understanding Swift Performance의 내용 중 Method dispatch에 대해서 공부하며 적은 글입니다. 출처는 알아보기 쉽도록 각 단락마다 적어놓았습니다. Static Dispatch 컴파일 타임에, 실행될 구현체를 결정할 수 있습니다. 런타임 시 올바른 구현체로 직접 jump 할 수 있습니다. (메모리 상에서 해당 코드의 주소로 이동하는 것이 jump로 표현되는 듯하다. 어셈블리어와 비슷한 느낌) 이 경우 컴파일러가 어떤 구현체가 실행될 것인지에 대해서 가시성을 가질 수 있습니다. (어떤 구현체가 실행될지 안다) 또, inlining과 같은 매우 적극적인 최적화 기법을 사용할 수 있습니다. Dynamic Dispa..
-
[백준] 18258 큐 2 - SwiftiOS/Swift 2022. 6. 10. 16:40
문제분석 문제 자체는 매우 간단하다. 큐를 구현해서 입력으로 주어지는 query에 대해서 큐 연산을 처리하면 된다. 하지만 Swift로 이 문제를 해결할 때에는 몇가지 주의사항이 있다. Swift는 표준입출력이 느리다. Array의 removeFirst()의 시간복잡도는 O(N)이다. 1번으로 인해서 입출력에 대한 처리를 해 주어야 하고, 2번으로 인해서 효율적인 큐를 구현할 방법을 생각해야 한다. 위 주의사항 때문에 이 문제를 Swift로 해결하기 매우 까다롭다. 첫 번째 사항에 대해서는 아래 gist의 글을 참고하면 된다. 이해는 하기 어려울 것이다. https://gist.github.com/JCSooHwanCho/30be4b669321e7a135b84a1e9b075f88#file-usage-swi..
-
[Swift Grammar] Guard구문에서의 non-Optional 선언iOS/Swift 2022. 5. 11. 14:50
한 줄 요약 (guard) case let을 사용해 선언해주면 된다. 본문 가끔 guard구문에서 여러가지 조건을 추가하기 위해서, non-Optional의 새로운 변수를 선언해야 하는 경우가 생긴다. guard구문 안에서 변수를 선언하게 되면, 해당 변수가 optional인지 아닌지에 대한 검사를 통해 Early exit이 이루어진다. 즉, guard구문 안에서는 항상 Optional 변수가 선언되어야 하므로, non-Optional 변수에 대해서는 오류가 발생한다. 이 때 case let을 사용해 선언해주면 오류를 해결할 수 있다. 예시를 통해서 자세히 알아보면 다음과 같다. 예시 SwiftUI에서, symbolName을 String으로 입력 받아, symbolName에 대응하는 systemName을..
-
[RxSwift6] "withUnretained" operator로 리펙토링하기iOS/RxSwift 2022. 2. 2. 22:17
이전에 글로 남겼다시피 subscribe, bind, drive등을 통해서 구독할 때 순환참조의 문제점을 방지하기 위해서 weak self를 통해서 약한참조를 만들어주었다. observable .subscribe(onNext: { [weak self] (string) in guard let self = self else { return } self.doSomething(string) }) .disposed(by: disposeBag)이 방식은 확실한 방법이였지만, 보일러 플레이트가 계속해서 만들어져 코드를 지저분하게 만들었다. RxSwiftCommunity의 RxSwiftExt에 있던 withUnretained operator은 이런 코드를 조금 더 명료하게 만들어주어 인기가 많았고, RxSwift 6...
-
[RxSwift] weak, unowned self에 대한 의문iOS/RxSwift 2022. 1. 27. 23:57
일단 기본적으로 두 용어의 개념은 생략하고 쓰임새를 써보자면 다음과 같다. weak는 객체를 Optional로 참조하기 때문에, 참조하는 객체가 도중에 사라질 가능성이 있을 때 사용한다. unowned는 객체를 Non Optional로 참조하기 때문에, 참조하는 객체가 항상 존재함(필요할 때)을 가정한다. weak는 필요할 때마다 Unwrapping에 대한 코드를 작성해야 하기 때문에 불편하다.. 기존에 갖고있던 생각 이제 RxSwift에서 두 키워드의 쓰임에 대해서 생각해보자. RxSwift에는 Observable의 생명주기를 관리(?)해주는 dispose 메서드, 그것을 더 편하게 도와주는 DisposeBag이 있다. DisposeBag은 최대 생명주기가 부모객체의 생명주기와 같다. 부모 객체가 de..