OptimizationTips 문서에서 Value Type(값 타입)은 COW(Copy-on-Write) 최적화를 사용한다고 합니다. COW 에 대해서 알아보기 전에 타입에 따라서 어떠한 식으로 복사하는지 알아봅시다. ✅ Swift 에서 값 타입과 참조 타입의 복사 방식은 다릅니다. 값 타입 : 깊은 복사(deep copy). 데이터 자체를 복사하는 방법. 독립적인 메모리를 차지하기 때문에 복사한 인스턴스의 데이터를 바꾸더라도 원본에 영향을 주지 않습니다. 참조 타입 : 얕은 복사(shallow copy). 최소한의 복사만 진행. 복사를 할 때 주소값을 공유한다. 원본과 복사본이 같은 주소값을 공유하므로 한 쪽의 데이터를 바꾸면 다른쪽에 영향을 줍니다. 값 타입은 수정하지 않아도 매번 데이터를 복사할 때..
좀 더 근본적인 질문을 던져보자. ✅ DispatchQueue 에서 strong reference cycle(강한 참조 순환) 은 발생할 수 있는가? 라는 질문에 대해서 결론적으로는 변수로 저장하지 않으면 강한 참조 순환이 발생하지 않는다. 즉, DispatchQueue 를 이니셜라이저를 통해 만들어서 변수에 저장하지 사용하지 않는 이상 강한 참조 순환은 발생하지 않는다. DispatchQueue 의 main 과 global 은 각각 타입 프로퍼티와 타입 메소드이기 때문에 호출하는 인스턴스가 레퍼런스 카운트를 올리지 않고, 강한 참조 순환에서 자유로울 수 있다. ✅ [weak self] 를 사용하지 않아도 될까? 그렇다면 [weak self] 와 같은 캡처리스트를 사용하지 않아도 될까? 그럼에도 불구하고..
Is it necessary to use [unowned self] in closures of UIView.animateWithDuration(...)? 이 글은 위의 stackoverflow 질문을 읽고 정리해본 글입니다. 작성자님의 질문을 아래와 같았다. 아래의 코드는 메모리 릭을 피할 수 있나요? UIView.animateWithDuration(1, animations: { [unowned self] in self.box.center = self.boxTopRightPosition }, completion: { [unowned self] completed in self.box.hidden = true }) 이 글에는 꽤나 많은 부분들이 연결되어 있기 때문에 샅샅히 살펴봐야 합니다. 🧐 우선 위의 a..
이 글은 ‘오늘도 개발자가 안 된다고 말했다’ 책을 읽고 내용과 느낀 점을 정리한 것입니다. 👉 상황에 맞는 이미지 형식 이미지 포맷은 비트맵과 벡터 방식으로 나뉜다. 비트맵 이미지는 작은 픽세들이 모여 하나의 이미지를 만드는 형태. 확대하면 깨져보이는 특징. 벡터 이미지는 점과 선으로 이루어진 이미지. 확대해도 깨지지 않는 특징. 대표적으로 JPEG, PNG, GIF, SVG 이미지 포맷이 있다. 알아보자. 1) JPG(JPEG) 손실 압축 포맷으로 압축할 경우 이미지의 품질이 떨어지지만, 용량을 많이 줄일 수 있다. 그림, 사진 등 웹에서 주로 사용하며 비트맵 방식이다. 2) GIF PNG 가 나타나기 전에 개발된 무손실 압축 포맷이다. 애니메이션을 지원한다. 색상을 256가지만 지원하기 때문에 다른..
https://school.programmers.co.kr/learn/courses/30/lessons/118666 import Foundation // 첫 번째 문자 : 비동의 1-3 // 4 // 두 번째 문자 : 동의 5-7 func solution(_ survey:[String], _ choices:[Int]) -> String { var choiceDictionary: [Character : Int] = [:] choiceDictionary = ["R" : 0, "T" : 0, "C" : 0, "F" : 0, "J" : 0, "M" : 0, "A" : 0, "N" : 0] var answer: String = "" for (index, choice) in choices.enumerated() {..
코딩테스트 연습 - 두 큐 합 같게 만들기 최근에 진행된 코딩테스트 문제가 공개가 되었다. swift 풀이가 많이 없어서 해결한 코드를 올려본다. 실패 - 정확성(56.7/100) import Foundation // 아이디어 : // L > R이라면, queue1의 원소를 queue2로 넘겨줍니다. // L Int { var answer: Int = 0 var queue1 = queue1 var queue2 = queue2 let queue1Sum: I..
예를 들어 많은 객체들이 해당 클래스를 상속받아서 같은 뷰를 가져야 한다면 서브클래싱을 하는 것이 유용하다. 이를 통해 재사용성이 좋아진다. 그렇다면 무조건 서브클래싱을 하는 것이 좋을까? 고려할 사항에 대해서 생각해보자. 고려할 사항 서브클래싱을 하다보면 복잡하고 깊은 클래스들의 상속관계를 만들게 됩니다. 이때 서브클래싱을 하는 목적이 인터페이스만 공유하는 것이라면 프로토콜을 사용하는 것이 바람직할 수 있다. 또한, 많이 변경되거나 많은 구현사항을 다른 클래스에 위임하게 된다면(예를 들어, UITableViewDelegate 와 같은 delegate) 델리게이트를 사용하는 것이 훨씬 동적인 클래스를 만들기 유용하다. 클래스를 확장하기 위한 기능으로써 카테고리도 좋은 방법이다. 카테고리를 통해 확장된 클..
Swift 의 dynamic dispatch 는 method table 에서 함수를 찾은 다음 indirect call 을 수행하여 구현되기 때문에 direct call 보다 수행이 느립니다. 또는 indirect call 은 많은 컴파일러 최적화를 방지하여 호출 비용이 비쌉니다. 그렇다면 서브클래싱과 오버라이딩이 필요없는 경우는 static dispatch 로 동작하는 것이 좋지 않을까? 맞습니다, 성능이 중요한 코드에서 성능 향상에 필요하지 않을 때 이 dynamic dispatch 동작을 제한할 수 있는 방법이 필요합니다. 성능 향상을 위한 Static Dispatch 메서드 뿐만 아니라 프로퍼티 역시 오버라이딩의 가능성이 있기 때문에 dynamic dispatch 로 동작합니다. 그래서 상속 가능..
- 2022 KAKAO TECH INTERNSHIP
- APNS
- configurable widget
- github
- IOS
- Notification
- SwiftUI
- MOYA
- Swift
- WWDC
- WWDC22
- projectsetting
- rxswift
- OpenSourceLibrary
- urlsession
- async/await
- MVVM
- watchOS
- containerBackground
- WidgetKit
- UserDefaults
- Protocol
- 서버통신
- Algorithm
- RxCocoa
- YPImagePicker
- Objective-C
- Firebase
- CloneCoding
- Widget
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Total
- Today
- Yesterday