전체 글(39)
-
메인스레드는 RunLoop가 도는 중인데 main queue 내 작업은 언제 할까?
잘 알고 있듯 UI 작업은 메인스레드에서 진행해야함을 익히 잘 알고 있을 것이다. DispatchQueue.main.async를 통해 메인 스레드에 작업 요청을 해본 적이 있을 텐데. DispatchQueue.main.async { self.label.text = "완료"} 여기서 자연스럽게 의문이 생긴다.메인 스레드는 이미 RunLoop를 돌리고 있는 중 아닌가?그렇다면 DispatchQueue.main에 들어간 작업은 언제 실행되는 걸까? 이 질문을 이해하려면 먼저 RunLoop를 “계속 CPU를 점유하는 무한 루프”로 생각하지 않아야 한다. 실제 RunLoop는 더 정확히 말하면 이벤트 대기 루프에 가깝다.개념적으로는 이런 모습이다. 즉, RunLoop는 할 일이 없을 때는 스레드를 잠들게 ..
2026.05.13 -
UIApplication.shared의 생성과 delegate 패턴의 역할
UIApplicationMain()은 앱 전체 인프라를 세우는 부트스트랩 과정에 해당한다.UIApplication 싱글턴 인스턴스가 생성 -> AppDelegate 클래스가 인스턴스화되고, UIApplication 싱글턴 객체에 할당됨메인 런루프 시작(이벤트를 수신하고 처리하는 무한 루프) UIApplication은 OS 영역에 속하는 객체앱 프로세스 생성, 메모리 관리, 이벤트 큐 처리 등 시스템 수준의 일을 담당.개발자가 어떻게 앱의 동작을 제어하는 건 delegate 패턴을 통해서다.UIApplicationMain()이 AppDelegate 인스턴스를 생성해 싱글톤 객체에 할당하는 순간, OS 영역과 개발 영역 간 브릿지가 놓인다고 생각할 수 있다.OS는 앱의 생명주기에서 중요한 이벤트가 발생할 ..
2026.05.13 -
@backDeployed 키워드에 대하여
StoreKit2 API로 업데이트 진행하고 있는 도중애플 문서 읽는 와중에 @backDeployed라는 키워드를 확인했습니다. @backDeployed Swift의 ABI(응용 이진 인터페이스, Application Binary Interface) 안정성과 관련된 속성(Attribute)새로운 API를 이전 OS 버전에서도 동작 가능하도록 백포팅을 하는 속성에 해당합니다. 새로운 Swift 표준 라이브러리 기능 또는 프레임워크 API가 추가될 때, 구현부가 OS에 포함되어 있는 경우도 있지만, 컴파일러가 포함시켜 앱 내부에 패키징된 상태가 될 듯 합니다. 일반적인 앱 개발 과정에서는 최신 라이브러리 버전을 앱에 포함시키기 때문에 @backDeployed 속성을 사용하지 않을 것 같고, 주로 SDK 개발..
2026.02.15 -
상위/하위 Spacer 우선 순위. fixedSize(), .frame(maxWidth:)
일부 뷰를 구현하는 중 상위 뷰에도 Spacer()이 존재하고, 하위 뷰에도 Spacer()이 존재하는 상황에서하위뷰의 Spacer()이 우선되는 것을 확인했다.1. 상위/하위에 Spacer()가 공존할 경우• SwiftUI는 자식 뷰들이 최대한 크기를 확장하고 나서, 남는 공간을 Spacer()에 분배.• 기본적으로 자식 뷰의 Spacer()가 먼저 공간을 가져가면, 상위 뷰의 Spacer()는 남은 공간만 가질 수 있다.상위 뷰의 Spacer()이 우선되도록 하는 방안을 고려하면 다음과 같은 방안들을 고려할 수 있다.방법 1VStack { Spacer() // 상위 Spacer HStack { Text("하위 뷰") Spacer() // 하위 Spac..
2025.08.04 -
SwiftUI Apprentice chapter 11 managing data with property wrappers 리뷰
@State, @Binding, @Environment, @StateObject, @EnvironmentObject에 대한 리뷰. value 타입, 구조체 @State : Source of truth // @Binding : values come from a parent view // 부모 뷰로부터 전달 받은 value (read, write 모두 가능)- read-only로 전달할 경우, 바인딩 없이 전달 가능@Environment : environment value persists within the subtree of the view 그림으로 표현했을 때 다음과 같이 생각됨. reference 타입, 클래스 @StateObject - @ObservedObject의 관계는 구조체의 @State와 @..
2024.08.21 -
Swift Objective C 네임 맹글링(Name Mangling) 문제
Swift로 작성된 함수를 기본적으로 C 인터페이스에서 동작하는 Unity 나 Unreal 등의 게임엔진 또는 직접 C 코드에서 호출하게 되는 상황에서 네임 멩글링(Name Mangling)으로 인한 경고 또는 에러를 경험할 수 있다.C 인터페이스에서 동작하는 이유는 다양한 언어 간 상호 운용이 가능하기 때문. C++ 및 Swift는 함수 오버로딩과 네임스페이스를 지원하기 위해 함수 이름을 내부적으로 변경하는 "네임 맹글링"을 사용한다.Swift에서는 특히 Objective-C에서 사용할 수 있도록 @objc, @objcMember 와 같은 애트리뷰트(attribute)를 사용하는 것과 관련이 있다. 좀 더 자세히 설명한다면 네임 맹글링(Name Mangling)은 컴파일러가 함수와 변수의 이름을 고유..
2024.06.24