iOS/Swift
-
그동안 수없이 사용했던 캡쳐리스트에 대해 오해하고 있었던 것 같아서 다시 정리한다.클로져를 사용할 때 같은 컨텍스트에 있는 변수들을 캡쳐리스트 없이 사용하게 되면 reference type이든, value type이든 무조건 reference로 캡쳐된다.캡쳐리스트를 사용하면 value type은 클로져 생성 시의 값을 그대로 복사하여 value를 캡쳐할 수 있다.단 reference type은 캡쳐 리스트를 사용해도 reference로 캡쳐가 되기 때문에 weak, unowned 를 사용하여 retain cycle을 피할 수 있도록 해야 한다. 명시하지 않으면 strong 캡쳐가 기본이다.(Edit)value type은 캡처리스트 없이 캡쳐해도 값 그대로 복사되는 것 같은데?이거 검증이 좀 필요한 것 같..
캡쳐리스트그동안 수없이 사용했던 캡쳐리스트에 대해 오해하고 있었던 것 같아서 다시 정리한다.클로져를 사용할 때 같은 컨텍스트에 있는 변수들을 캡쳐리스트 없이 사용하게 되면 reference type이든, value type이든 무조건 reference로 캡쳐된다.캡쳐리스트를 사용하면 value type은 클로져 생성 시의 값을 그대로 복사하여 value를 캡쳐할 수 있다.단 reference type은 캡쳐 리스트를 사용해도 reference로 캡쳐가 되기 때문에 weak, unowned 를 사용하여 retain cycle을 피할 수 있도록 해야 한다. 명시하지 않으면 strong 캡쳐가 기본이다.(Edit)value type은 캡처리스트 없이 캡쳐해도 값 그대로 복사되는 것 같은데?이거 검증이 좀 필요한 것 같..
2023.11.17 -
이미 다 아시는 내용일 수도 있지만... Rx를 많이 쓰다보면 아래와 같은 크래시 로그를 마주하는 것이 낯설지 않죠.. 그런데 QA나 CS로 들어오는 크래시 로그는 위의 경우 처럼 정작 애플리케이션 코드(위에서는 UseCase라고 되어 있는 부분)의 콜스택은 symbolification되어 있지 않은 경우가 많습니다. 이 경우에 RxSwift 콜스택을 이용하면 의외로 쉽게 문제가 된 지점을 찾아낼 수 있습니다. 위의 콜스택에서 protocol witness for ObserverType.on(_:) in conformance XXXSink 라고 되어있는 콜스택은 Rx의 XXX 오퍼레이터를 사용한 부분이라고 볼 수 있고 따라서 이 경우는 다음과 같은 순서로 Rx 오퍼레이터가 사용된 곳이라고 볼 수 있습니다..
[Tip] RxSwift 콜스택만 잔뜩있는 크래시 로그로 디버깅하기이미 다 아시는 내용일 수도 있지만... Rx를 많이 쓰다보면 아래와 같은 크래시 로그를 마주하는 것이 낯설지 않죠.. 그런데 QA나 CS로 들어오는 크래시 로그는 위의 경우 처럼 정작 애플리케이션 코드(위에서는 UseCase라고 되어 있는 부분)의 콜스택은 symbolification되어 있지 않은 경우가 많습니다. 이 경우에 RxSwift 콜스택을 이용하면 의외로 쉽게 문제가 된 지점을 찾아낼 수 있습니다. 위의 콜스택에서 protocol witness for ObserverType.on(_:) in conformance XXXSink 라고 되어있는 콜스택은 Rx의 XXX 오퍼레이터를 사용한 부분이라고 볼 수 있고 따라서 이 경우는 다음과 같은 순서로 Rx 오퍼레이터가 사용된 곳이라고 볼 수 있습니다..
2023.11.16 -
some - opaque type 특정 프로토콜을 준수하는 것을 나타내는 불투명 유형을 만들기 위해 프로토콜과 함께 사용된다. 불투명 유형의 기본 유형은 변수 scope 내에서 하나로 고정되어야 합니다. 같은 구체 타입의 새로운 인스턴스를 변수에 할당하는 것도 금지되어 있습니다. 배열이나 리턴타입에서도 하나의 구체 타입으로 고정되어야 합니다. any - existential type Existential Type (Existentials, 실존타입, 실존유형) protocol과 associated type을 이용하여 특정 바운더리로 제약시키는 방법 Swift 5.7부터 실존 타입에는 any를 쓰는 것이 필수다. 왜냐하면 실존타입을 사용하는 것이 동적 타입 결정으로 인한 성능 저하를 불러올 수 있음에도 너..
some, anysome - opaque type 특정 프로토콜을 준수하는 것을 나타내는 불투명 유형을 만들기 위해 프로토콜과 함께 사용된다. 불투명 유형의 기본 유형은 변수 scope 내에서 하나로 고정되어야 합니다. 같은 구체 타입의 새로운 인스턴스를 변수에 할당하는 것도 금지되어 있습니다. 배열이나 리턴타입에서도 하나의 구체 타입으로 고정되어야 합니다. any - existential type Existential Type (Existentials, 실존타입, 실존유형) protocol과 associated type을 이용하여 특정 바운더리로 제약시키는 방법 Swift 5.7부터 실존 타입에는 any를 쓰는 것이 필수다. 왜냐하면 실존타입을 사용하는 것이 동적 타입 결정으로 인한 성능 저하를 불러올 수 있음에도 너..
2023.07.25 -
Swift 개발자라면 한 번 쯤 봤을법한 아래 영상을 리마인드할 겸 다시 리뷰하던 중 이런 궁금증이 생겼다. https://developer.apple.com/videos/play/wwdc2016/416/ Understanding Swift Performance - WWDC16 - Videos - Apple Developer In this advanced session, find out how structs, classes, protocols, and generics are implemented in Swift. Learn about their relative... developer.apple.com "protocol을 채택하지 않는 struct도 3word가 넘으면 데이터가 heap에 저장될까?" 사실..
protocol을 채택하지 않는 struct도 3word가 넘으면 데이터가 heap에 저장될까?Swift 개발자라면 한 번 쯤 봤을법한 아래 영상을 리마인드할 겸 다시 리뷰하던 중 이런 궁금증이 생겼다. https://developer.apple.com/videos/play/wwdc2016/416/ Understanding Swift Performance - WWDC16 - Videos - Apple Developer In this advanced session, find out how structs, classes, protocols, and generics are implemented in Swift. Learn about their relative... developer.apple.com "protocol을 채택하지 않는 struct도 3word가 넘으면 데이터가 heap에 저장될까?" 사실..
2023.07.19 -
1. GameplayKit으로 상태표시UI 쉽게 만들기 - 노수진/네이버웹툰 https://www.slideshare.net/mobile/soojinro9/gameplaykit-ui GameplayKit으로 상태표시 UI 쉽게 만들기 복잡한 절차적인 코드를 정리할 수 있는 GameplayKit의 상태 머신을 사용해봅시다. www.slideshare.net GameplayKit은 게임에서 주로 사용하는 알고리즘 같은 것들을 제공함 GameplayKit에서 State Machine을 제공하고 UIKit과 함께 써도됨 GKState와 GKStateMachine [BP] GKState를 상속받은 공통의 상태를 만들어서 각각의 스테이트가 상속 받도록 하면 중복코드를 줄이고 코드관리하는데 용이하다. 음성인식 버튼과..
LetSwift in 판교 2차 후기1. GameplayKit으로 상태표시UI 쉽게 만들기 - 노수진/네이버웹툰 https://www.slideshare.net/mobile/soojinro9/gameplaykit-ui GameplayKit으로 상태표시 UI 쉽게 만들기 복잡한 절차적인 코드를 정리할 수 있는 GameplayKit의 상태 머신을 사용해봅시다. www.slideshare.net GameplayKit은 게임에서 주로 사용하는 알고리즘 같은 것들을 제공함 GameplayKit에서 State Machine을 제공하고 UIKit과 함께 써도됨 GKState와 GKStateMachine [BP] GKState를 상속받은 공통의 상태를 만들어서 각각의 스테이트가 상속 받도록 하면 중복코드를 줄이고 코드관리하는데 용이하다. 음성인식 버튼과..
2020.01.16 -
이슈의 시작: 다운 사이징을 했는데 이미지 데이터 크기가 오히려 늘어났다 예전에 개발을 담당했던 모 서비스에서 이미지를 전송할 때 이미지가 5MB(압축하지 않은 JPEG데이터 기준)를 넘어가면 긴 변(long edge)을 1920px로 리사이징하는 정책이 있었습니다. 그래서 프로젝트 내에 있었던 UIImage extension 의 resize 메소드를 사용했습니다. 그런데 이상하게도 특정상황에서 사진 전송시 10초로 설정해 놓은 타임아웃이 발생했고 디버깅한 결과 파일 사이즈가 20MB가 넘어가서 10초안에 전송이 안되는 것이 원인이었습니다. 처음에는 '특정상황에서 이미지 리사이징을 안타고 있는 모양이다'고 생각했습니다. 그런데 확인해 보니 예상과 달리 리사이징 로직을 잘 타고 있었고, 리사이징 전에 43..
iOS에서의 이미지 리사이징에 대하여이슈의 시작: 다운 사이징을 했는데 이미지 데이터 크기가 오히려 늘어났다 예전에 개발을 담당했던 모 서비스에서 이미지를 전송할 때 이미지가 5MB(압축하지 않은 JPEG데이터 기준)를 넘어가면 긴 변(long edge)을 1920px로 리사이징하는 정책이 있었습니다. 그래서 프로젝트 내에 있었던 UIImage extension 의 resize 메소드를 사용했습니다. 그런데 이상하게도 특정상황에서 사진 전송시 10초로 설정해 놓은 타임아웃이 발생했고 디버깅한 결과 파일 사이즈가 20MB가 넘어가서 10초안에 전송이 안되는 것이 원인이었습니다. 처음에는 '특정상황에서 이미지 리사이징을 안타고 있는 모양이다'고 생각했습니다. 그런데 확인해 보니 예상과 달리 리사이징 로직을 잘 타고 있었고, 리사이징 전에 43..
2019.09.27