| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- modulararchitecture
- mach-o파일분석
- 뷰를그리는메서드
- swift-demangle
- uicollectionview
- ios바이너리분석
- mangle
- IOS
- actor
- WWDC24
- cgimage
- updatecycle
- Architecture
- Xcode
- 이진삽입정렬
- displayscale
- UIKit
- task
- 뷰의레이아웃을계산하는메서드
- 다이나믹링크분석
- XCUITest
- swiftconcurrency
- applaucnchprocess
- swift6
- ciimage
- Swift
- xcrun swift-demangle
- SPM
- swift6.1
- mainrunloop
- Today
- Total
목록Swift (16)
꾸준한 기록
1. Actor는 순서가 중요한 비동기작업에는 적합하지 않다.- 순서가 중요한 비동기 작업에는 GCD를 사용해야 한다.- Actor는 priority inversion을 해결하기 위해, actor에서 실행되는 작업의 순서를 변경할 수도 있기 때문이다.- 출처: Swift Evolution 제안서 SE-0306Implementation note: At an implementation level, the messages are partial tasks (described by the Structured Concurrency proposal) for the asynchronous call, and each actor instance contains its own serial executor (also in t..
Language and Standard Library1. nonisolated 키워드를 extension과 type에 추가할 수 있게 되었습니다.이전까지는 프로퍼티나 메서드 단위로 추가해야 했는데, type 단위로도 추가할 수 있게 되어서 편리해졌습니다.@MainActorstruct S { let id: Int let name: String // mutable state and MainActor methods}/// extension 단위로 추가할 수 있게 됨nonisolated extension S: CustomStringConvertible, Equatable { var description: String { "id: \(id), name: \(name)" } static func =..
다이나믹 라이브러리에서 외부로 export 하는 심볼을 확인할 때 `swift-demangle` 이라는 옵션을 같이 사용한다.만일 `swift-demangle` 옵션을 사용하지 않으면, 심볼이 mangle되어서 심볼이 어떤 타입을 나타내는지 읽기 어렵다. 아래에 mangle된 심볼 모습을 보면 알아보기 힘든 형태로 되어있다. 동일한 것을 `swift-demangle` 옵션을 붙여서 심볼을 demangle 시키면 훨씬 보기 쉬운 것을 확인할 수 있다.UserDTO라는 것을 알가보기가 훨씬 더 쉽다. 그렇다면 왜 mangle 되는 것일까?symbol이 어떤 타입인지를 symbol의 이름 안에 같이 담는 것이다. 이를 통해서 Swift는 런타임에 오버로딩된 함수들을 구별할 수 있다. 또한 다이나믹 링커가 정확..
1. 버블 정렬안접한 두 개씩 비교하고, 순서가 잘못되었으면, 교환한다.시간 복잡도최악: O(n제곱)최선: O(n), 이미 정렬된 경우 특징: 단순, 비효율적, 작은 데이터 셋에서 적합 2. 선택 정렬배열에서 가장 작은 (또는 큰)요소를 선택해서, 순차적으로 배열의 맨앞과 교체 시간 복잡도최악: O(n제곱)최선: O(n제곱)특징: 비교횟수가 고정되어있어, 비교 연산 비용이 중요한 경우 유리할 수도 있음 3. 삽입 정렬배열을 순차적으로 탐색, 각 요소를 이미 정렬된 부분에 삽입시간 복잡도최악: O(n제곱)최선: O(n), 이미 정렬된 경우 작은 데이터셋이나, 이미 정렬된 경우에 적합 4. 퀵 정렬배열에서 하나의 기준점을 설정하고, 기준점보다 작은 요소와 큰 요소로 분할하면서 재귀적으로 정렬 시간 복잡도최악..
sort()에서 사용하는 알고리즘Timsort: merge sort와 insertion sort를 같이 사용정렬할 데이터를 작은 그룹으로 나눈다. 각 그룹에서는 insertion sort를 사용그룹을 합칠 대는 merge sort를 사용시간복잡도: O(nlogn)이미 데이터가 정렬되어 있는 경우: O(n), 각 데이터가 정렬이 되어있는지 스캔하는 작업insertion sort데이터를 앞에서부터 차례대로 정렬한다. 데이터를 이미 정렬된 데이터에서 올바른 위치로 삽입하는 방식으로 정렬최악의 경우 시간 복잡도: O(n제곱), 데이터가 역순으로 정렬되어있을 경우, 모든 데이터를 검토하고, 정렬하는 작업을 한다.이미 정렬된 데이터 시간 복잡도: O(n), 스캔작업만 한다. 각 데이터가 삽입될 자리를 찾기 위해 한..
Swift에서 객체를 참조할 때, 참조 타입 종류1. Strong- refernce count를 올리는 참조 2. weak- reference count를 올리지 않는 참조. 참조하는 객체가 nil이 될 수 있다. 3. unowned- reference count를 올리지 않는 참조. 참조하는 객체가 nil이 되지 않을 것이라고 가정한다. - 따라서 unowned로 참조하는 객체가 메모리에서 제거되었을 때, 이 객체를 참조하면 crash가 발생한다.
Swift Package Manager에서 Framework가 target에 붙을 때, Dynamic Framework로 붙을지, Static Framework로 붙을지는 Package 개발자가 결정한다.라이브러리 사용자는 SPM으로 가져온 외부 라이브러리를 static 하게 링크 시킬지, dynamic하게 링크 시킬지 결정할 수 없다. (Package 개발자가 static, dynamic 중에서 선택할 수 있도록 옵션을 제공할 때만 가능하다.)SPM은 기본적으로 Static Link를 사용한다.SPM은 컴파일된 결과물이 아니라, 소스 코드를 공유하도록 설계되었다. 하지만 소스 코드 대신 `XCFramwork`를 Swift Package로 wrapping해서 공유하는 것이 일반적인 광행이 되었다.
`objc_getAssociationObject` 혹은 `objc_setAssociationObject`를 사용할 때 내부에서 associationManager가 생성됨.associatinoManager는 associationObject를 보관하는 테이블을 가지고 있음그 테이블에서 association Object를 참조한다.
1. Swift Concurrecy에서 컴파일러가 race-condition이 안전한지 탐지할 때, false positive 현상이 줄었다.class Swift6User { var name: String init() { name = "" }}struct CompleteConcurrencyChecking: View { var body: some View { Text("Hello, World!") .task { let user = Swift6User() await loadData(for: user) } } func loadData(for us..
Task 는 무엇인가?동시성으로 실행되는 코드 블럭 단위Task 내부는 순차적으로 실행된다.async-await 메서드는 반드시 Task 혹은 async-await 메서드에서 호출되어야 한다. Task는 바로 실행될 수도 있는가?그럴수도 있고 아닐 수도 있다.예를 들어서, Task는 기본적으로 비동기 코드 블럭이어서 스케쥴링하는 것은 개발자의 몫이 아니기 때문이다.그렇다면 AppDelegate에서 아직 applicationDidBecomeActive가 호출되지 않아서, view가 생성되지 않았을 때, 이때까지 대기하는 것을 Task.yeild로 수행할 수 있는가? Task에서 주의해야 하는 사항unstructured Task: 일반적으로 Task {} 로 생성하는 것은 unstructured task이기..