iOS
-
UIView 가 사라지는 타이밍은? like viewDidDisappeariOS 2025. 4. 25. 18:44
WKWebView처럼 뷰가 사라질 때 작업들을 해줘야 하는 경우가 있습니다.UIViewController 에선 다양한 lifeCycle 메서드를 제공합니다.따라서 viewWillDisappear, viewDidDisappear 를 비롯해 원하는 타이밍에 필요한 작업을 해줄 수 있습니다.하지만 UIView는 이런 lifeCycle 메서드를 세밀하게 제공해 주지 않습니다.그래서 보통 deinit 에서 해주곤 했었는데요.Swift 에서 isolated 개념이 강화되면서 deinit 에서 self를 참조할 수 없어 곤란한 상황들이 있습니다.deinit 에서도 캡처를 통해 기존처럼도 사용할 수 있지만, 메모리 이슈가 생길 위험이 있다고 생각이 들었습니다.그래서 뷰가 제거되는 좀 더 안전한 타이밍을 찾아보았습니다...
-
[Swift6] WebView 에서 워닝이 발생할 때iOS 2025. 4. 25. 13:47
Swift6 를 대응하다보면 바로 하기엔 수정 규모가 너무 크기 때문에 Strict Concurrency Checking 을 우선 minimal 로 두고 워닝을 제거하는 과정을 거치게 됩니다.이때 WebView를 Import 하는 부분에서 워닝이 발생합니다.Add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'WebKit'코드엔 워닝이 없고 다짜고짜 import 에 워닝이라니...이때 제안해주는 대로 @preconcurrency 를 바로 붙이자니 찜찜합니다.다행히 Strict Concurrency Checking을 Complete로 변경하면 문제가 되는 코드를 찾을 수 있습니다. # WKNavigationDelegateWK..
-
XcodeMacro 헤더 주석 변경하기iOS 2025. 1. 22. 01:32
Macro 헤더 주석이란 Xcode에서 파일을 새로 생성하면 자동으로 상단에 생기는 아래 형태의 주석을 말합니다.////// ContentView.swift// MyApp//// Created by woongs 1/22/25.// 회사나 집, 그밖에 여러 기기를 사용할 때 등등 이 Macro가 원하지 않게 생기는 형태가 있을 수 있을텐데요.자주 하는 동작은 아니다 보니 할 때마다 헷갈리고 귀찮은데,, 생각보다 잘 정리된 곳이(제 수준에 맞춰..) 없어서 한번 정리차 남겨봅니다.복잡하자면 이것저것 내용이 많지만 핵심은 매----우 간단합니다.1. Xcode는 파일을 생성할 때 IDETemplateMacros.plist 파일을 찾아 만든다.2. 다음과 같은 탐색 경로를 찾으며, 먼저 발견된 템플릿을 사..
-
내 앱의 Crashlogs 확인하기 (dSYM은 뭔가?)iOS 2025. 1. 17. 19:02
Crashlog 를 통해 크래시가 발생했던 시점을 Xcode에서 재현할 수 있습니다.Crashlog 를 확인하고 제대로 이용하기 위해 주의해야 할 점들을 알아봅니다. 1. Crashlog 확인하기아래 경로를 통해 내 앱의 크래시 로그를 확인할 수 있습니다. Xcode에서 해보기.위 경로로 들어가서 로그인하면 위와 같은 내 앱에서 발생한 크래시 로그들을 확인할 수 있습니다. 크래시 로그가 발생한 Project를 기반으로 열면, 아래와 같이 크래시 난 상황이 재현됩니다. ctrl 키를 누르고 로그 목록을 누르면 finder 에서 로그 파일을 직접 확인할 수도 있습니다. 2. Crashlogs를 제대로 사용하기 위한 주의사항 크래시 로그를 제대로 활용하려면, 해당 크래시가 발생한 같은 시점의 커밋으로 열어..
-
Preference (PreferenceKey)iOS 2024. 11. 24. 20:36
1. Preference 란상위 뷰에서 하위 뷰로 전달하는 환경 변수(Environment)와 달리하위 뷰에서 구성된 정보를 상위 뷰 (Container)로 전달할 때 사용합니다.애플 문서의 그림이 해당 내용을 잘 표현해 주고 있는 것 같습니다. Environment 는 여러 하위 뷰로 동시에 전달되지만 (flows down)Preference는 하나의 단일 값으로 상위 뷰에 전달 됩니다. 따라서 어떻게 합쳐질지 결정해야 합니다. (flowing up) 2. 사용2.1 ModifiernavigationTitle 처럼 이미 Preference를 이용해 만들어져 있는 많은 Modifier 들이 존재합니다.navigationTitle를 사용하는 예시를 보면, NavigationView 내부 컨텐츠인 VSta..
-
[MTL] MTLTextureiOS/Metal 2024. 8. 20. 19:38
A resource that holds formatted image data. 'GPU에서 처리할 수 있도록 정제된 이미지 정보를 갖고 있는 자원'을 추상화시켜 놓은 객체입니다. 이 프로토콜을 직접 구현하지 말고 주어진 instance 생성 메서드들을 이용해서 생성해야 합니다 !Don’t implement this protocol yourself; instead, use one of the following methods to create a MTLTexture instance 1. MTLTextureDescriptor 이용하기descriptor to textureMTLTextureDescriptor를 만들고 MTLDevice의 makeTexture(descriptor:) 를 사용해 texture를 생성..
-
[iOS] OSSignpost > 특정 작업의 duration 측정하기iOS 2024. 7. 1. 20:41
앱의 성능을 측정해 보려고 합니다.그 중에서도 특정 작업이 완료되기까지 시간이 얼마나 걸렸는지를 측정해 보려고 합니다.주로 네트워크 통신이나 이미지 랜더링 같은 작업이 오래 걸리는 시간을 측정해볼 때 유용하게 사용될 수 있을 것 같습니다.# OSSignposterSignposts allow you to record meaningful information about the duration of your app’s tasks using the same subsystems and categories that you use for logging.Signposts는 특정 작업의 응답 시간을 측정하는 도구입니다.아이디어는 시작과 끝에 트리거를 주고 얼마나 걸렸는지 체크하는 것입니다.그리고 이걸 instrument..
-
이미지의 크기를 줄인다. 리사이징 ? 압축 ? 해상도? 품질?iOS 2024. 5. 10. 01:44
앞서 픽셀의 개념과 함께 고해상도는 무엇인지에 대해 이해했습니다. 하지만 항상 고해상도의 이미지가 좋기만 한 것은 아닙니다. 세상에 공짜는 없기 때문에 고해상도의 많은 픽셀을 저장하려면 그만큼 많은 공간이 필요합니다. 당연히 처리하는 시간도 오래 걸릴 것입니다. 아주 작은 영역이라면 그렇게까지 필요하지 않은데도 말이죠. 그래서 개발을 하다보면 이미지의 크기를 줄여야 하는 경우가 생깁니다. 이미지의 크기. 어떻게 줄일 수 있을까요? 방법은 크게 2가지가 떠오릅니다. 픽셀 자체를 버리거나, 저장할 때 최대한 최적화를 시켜야 할 것입니다. 픽셀 자체를 버리는 것을 리사이징 (Resizing) 해상도는 유지하면서 저장 방식을 바꾸거나 데이터를 최적화하는 것을 압축 (Compression) 이라고 합니다.리사이징..