Dynamic Dispatch는 어떻게 이루어지는가? 클래스 VS 프로토콜
·
iOS
사실 이게 첫번째 글이 아니에요. 프로토콜은 어떻게 동작하고 채택당한놈은 어떻게 알고 필수 메서드들을 구현하라고 컴파일 에러가 뜨는지 궁금했던 저는 더 나아가 프로토콜을 채택한 다양한 타입들이 같은 배열에 들어갔을 때, 어떻게 각각 올바른 메서드를 호출할 수 있을까?. 꼬꼬무하다보니 여기까지 왔습니다..쫌 어려웠어여. 주에 한번씩 복습할예정!! 들어가보자~잇!Dynmaic Dispatch정적 디스패치와 달리 런타임에 호출할 메서드가 결정되는 것입니다소스코드를 파싱하여 AST트리를 생성하고 의미분석하여 타입검사하고 중간언어인 SIL로 변환되는데 여기서 정적/동적 디스패치가 결정Virtual Tablefinal 키워드가 붙지 않은 클래스는 상속이 가능하기에 dynmaic Dispatch가 이루어진다.. 런타..
Preview는 어떻게 그림을 그리는 걸까? is that hotreload?
·
iOS
이전에 플러터로 개발했을때 플러터에는 Hot reload라는 아주 핫하고 편리한 기능이 있었습니다. 이는 코드를 변경을 하면 즉시 실시간으로 UI를 업데이트해서 뷰짤때 너무나 효율이 올라간 느낌.. 이 기능이 가능한 이유는 Dart언어와 그 실행환경때문입니다ㅣ.Flutter Hot reload프로세스1. 변경감지: 개발자가 Dart 소스 코드를 수정하고 저장하면, Flutter의 IDE가 이를 감지한다.2. 코드전달: 수정된 코드가 Dart VM에 전달된다. Flutter는 앱을 실행 중인 가상머신과 연결되어 있어, 이 변경사항을 실시간으로 보낼 수 있ㄷ.3. 클래스업데이트: DartVM은 변경된 소스 기반으로 앱의 클래스를 업뎃한다.4. 위젯 재빌드: 필요한 최소한의 위젯만 다시 빌드한다. 그리고..
NSObjcet 음.. SwiftUI에선?
·
iOS
흠..이거 관련된건 개발쪽인가 면접준비쪽인가..면접에서 안물어볼거같긴한데. both인가뭐 우리가 UIKit으로 개발을 하다보면 NSObject를 상속해야하는 경우를 많이 만날 수 있다. 없으면 추가하라고 빨간 이슈가 뜬다. 대체 뭐길래??사실 이건 Objective-C의 잔해?라 하긴 그렇고 뭐라해야하지 어쨋거나 Objective-C관련된 것이다.NSObject는 Objective-C Runtime 시스템의 최상위 클래스로, 모든 Objective-C 및 Swift 클래스의 기반이 된다. Cocoa 및 Cocoa Touch 프레임워크의 루트 클래스로, 이 클래스를 상속받음으로써 런타임 시스템과 상호작용할 수 있는 기능을 포함하게 된다.NSObject를 상속받으면?• Objective-C 객체처럼 동작할 ..
명령형과 선언형, 그리고 FP까지
·
iOS
iOS 개발을 하다 보면 "UIKit은 명령형, SwiftUI는 선언형"이라는 말을 자주 듣게 되는데요. 처음엔 그냥 "아 그렇구나" 하고 넘어갔었는데, 실제로 둘 다 써보니까 왜 이런 구분이 필요한지 몸소 느끼게 되더라고요.특히 SwiftUI로 넘어오면서 코드가 훨씬 간결해지고 예측 가능해졌는데, 이게 단순히 새로운 문법 때문만은 아니라는 걸 깨달았어요. 프로그래밍 패러다임 자체가 다르기 때문이었거든요.그런데 여기서 한 가지 깨달은 게 있었어요. 선언형 프로그래밍의 본질은 단순히 "무엇을 원하는가"를 명시하는 게 아니라, "추상화 레벨을 높여서 복잡함을 숨기는 것"이더라고요.토스 팀의 아티클을 보면서 이 부분이 더 명확해졌는데, 결국 우리가 매일 쓰는 for...in 반복문도 선언형 코드라는 거예요.프..
SwiftUI runLoop
·
iOS
https://www.youtube.com/watch?v=MTGh9U2yHNMSwiftUI Run Loop란 무엇인가?SwiftUI에서 UI 업데이트가 어떻게 이루어지는지 궁금해하신 적 있나요? 🤔SwiftUI는 내부적으로 Run Loop라는 시스템을 통해 UI 업데이트를 관리합니다. 이 Run Loop는 Swift 5.5부터 Main Actor 위에서 동작하며, 다음과 같은 역할을 수행합니다:사용자 이벤트 수신 (터치, 스와이프 등)모델 업데이트 허용SwiftUI 뷰를 화면에 렌더링이 과정을 "Run Loop의 틱(tick)"이라고 부르는데, 왜 이런 용어를 쓰는 걸까요? 마치 시계가 째깍째깍 소리를 내듯이, SwiftUI도 주기적으로 상태를 확인하고 UI를 업데이트하기 때문입니다! @Publishe..
메모리관리(weak self와 guard의 만남)
·
iOS
강한 참조 순환 vs 지연된 할당 해제처음에 저는 [weak self]를 언제 써야 하는지 정말 헷갈렸어요. "그냥 항상 쓰면 되는 거 아닌가?" 싶었는데, 알고 보니 두 가지 서로 다른 문제를 해결하는 거더라고요.1. 강한 참조 순환 (Strong Reference Cycle)원인: 두 객체가 서로를 강하게 참조해서 순환 고리가 형성됨결과: 메모리 누수 - 객체가 영원히 해제되지 않음 💥해결책: weak 또는 unowned 참조 사용2. 지연된 할당 해제 (Delayed Deallocation)원인: 객체가 클로저에 의해 강하게 참조되고, 클로저 실행이 지연됨결과: 객체의 메모리 해제가 지연되지만, 결국에는 해제됨부작용: 불필요하게 메모리를 오래 점유하거나, 해제된 후에도 작업이 계속될 수 있음가장 ..
Hash-Hashable을 곁들인
·
iOS
사실 이건 기본중의 기본이다. 이미 알고리즘을 풀며도 사용하고 개발을 할때도 이미 많은 곳에 포함되어있다. 하지만 내 블로그에는 따로 정리를 해놓은 적이 없어 딥다이브로 파고들 생각이다. 자 들어가자해쉬🌞Hashing은 임의의 각각 크기를 가진 입력 데이터를 고정 크기의 값으로 변환하는 과정으로, 이를 해시 함수(Hash Function)가 담당한다. 이 과정에서 생성된 출력값은 해시 값(Hash Value) 또는 해시 코드(Hash Code)라고 한다원본 데이터인 키값을 저 hash function을 통해 64 bit의 int형으로 변환한 것을 확인 할 수 있다. 일반 적으로 키 값이 동일하면 해쉬결과값도 동일하게 나온다. Hash Function를 통해 어떠한 값이 들어오건 정해진 자료내의 결과값으..
Preference Key
·
iOS
PreferenceKey는 하위 뷰에서 상위 뷰로 데이터를 전달하기 위한 메커니즘입니다. 일반적으로 SwiftUI는 데이터가 상위 뷰에서 하위 뷰로 전달되는 구조를 따르지만, PreferenceKey는 그 반대 흐름을 가능하게 해줍니다.PreferenceKey의 주요 구성 요소PreferenceKey는 다음과 같이 세 가지 주요 요소로 이루어집니다:키 등록: PreferenceKey 프로토콜 준수 및 타입 정의값 송신: 하위 뷰에서 preference 메소드를 통해 값 전달값 수신: 상위 뷰에서 onPreferenceChange 메소드를 통해 값 수신PreferenceKey 프로토콜 구조SwiftUI에서 PreferenceKey는 아래와 같은 프로토콜로 정의됩니다.public protocol Prefer..
SilentPush&RichPush
·
iOS
What is SilentPush?- 백그라운드에서 앱 업뎃하기 즉 유저가 느끼지 못하게 앱 내에서 정보를 업뎃해야할 때 사용한다. 내가 개발하는 앱에서는 해당 날짜의 여행이 있을때 silentPush로 상태 변화를 위해 사용했다. 기존의 코드에서는 매일 24시간마다 백그라운드에서 allFetch를 통해 여행이 있는지를 체크해주었지만 이는 여행이 없더라도 매일 백그라운드에서 업뎃을 하기에 비효율적이라고 판단했다.Silent Push 페이로드에서는 3가지가 값이 추가로 있어야 가능하다고 한다. "content-available": 1, "apn-push-type": "background","apn-priority": 5apple developer에 보면 이 푸쉬는 우선순위가 낮아 짧은 시간에 노티피케이션 ..