전체 글

나만의 개발 코드 저장소 ㅎ
Swift

[Swift] iOS FontParser 경고 원인과 해결법 (SDK에 폰트 포함된 경우)

“앱에 분명히 폰트 등록해놨는데… 왜 자꾸 못 찾는다고 뜨지?”현상: 폰트가 없다는 이상한 경고최근 프로젝트에서 아래와 같은 로그를 만났습니다:FontParser: could not open filePath .../Pretendard-Thin.otf: [2: No such file or directory]GSFont: file doesn't exist - "file:///.../Pretendard-Thin.otf"하지만 분명 Info.plist에는 UIAppFonts 항목이 제대로 등록돼 있었습니다:UIAppFonts Pretendard-Thin.otf🤔 “폰트 이름도 틀리지 않았고, 파일도 SDK에 포함돼 있는데 왜 이러지?”원인: 폰트는 SDK에 있고, 시스템은 메인 앱 번들에서 찾는다iOS의..

Swift

[Swift] 클로저의 캡처리스트('[]')

오늘은 Swift의 클로저와 캡처리스트에 대해 이야기해보려 합니다. 특히 클로저에서 값 타입과 참조 타입의 캡처 방식과 순환 참조 문제를 해결하는 캡처리스트의 중요성에 대해 집중적으로 다루겠습니다. 클로저의 기본 캡처 방식 Swift에서 클로저는 기본적으로 외부의 변수를 캡처할 때 참조 타입으로 캡처합니다. 즉, 값 타입이든 참조 타입이든 상관없이 클로저 내부에서는 모두 참조로 취급됩니다. 이는 매우 편리한 기능이지만, 때로는 메모리 관리나 예상치 못한 동작을 야기할 수 있는 문제점을 내포하고 있습니다. 캡처리스트와 값 타입의 복사 클로저에서 캡처리스트를 사용하면, 이야기가 조금 달라집니다. 캡처리스트를 사용하면 값 타입을 복사해서 가져올 수 있습니다. 이는 값 타입이 원래 값을 유지하면서 클로저 내부에..

Swift

[Swift] mutating 키워드 알아보기

Swift에서 구조체와 열거형을 사용하다 보면 mutating이라는 키워드를 종종 마주치게 됩니다. 처음 접할 때는 조금 헷갈릴 수 있는데, 이 글에서는 mutating의 필요성과 함께 Swift의 값 타입에 대한 개념도 함께 정리해보겠습니다. mutating이란? mutating 키워드는 Swift의 구조체나 열거형 내의 메서드에서 사용되며, 해당 메서드가 자기 자신의 프로퍼티나 값을 변경할 수 있음을 나타냅니다. struct Counter { var count: Int = 0 mutating func increment() { count += 1 } } 이 구조체의 increment 메서드에 mutating 키워드가 있기 때문에 count 값을 변경할 수 있습니다. 값 타입이란? Swift에는 크게 값..

Swift

[Swift] 클로저와 NotificationCenter를 활용한 상태 변화 알리기(View Controller 간의 상호작용)

안녕하세요, 지난 포스트에서는 Delegate 패턴을 이용한 뷰 간의 상태 변화 알리기에 대해 알아보았습니다. 이번에는 Delegate 패턴에 이어서 클로저와 NotificationCenter를 활용하여 뷰 간의 상태 변화를 알리는 방법에 대해 알아보겠습니다. 1. 클로저를 활용한 상태 변화 알리기 Swift에서 클로저는 자유 변수와 관련있는 코드 블록입니다. 함수처럼 이름이 없으며, 독립적으로 사용할 수 있습니다. 클로저를 활용하면 상태 변화를 효율적으로 관리할 수 있습니다. class FirstViewController: UIViewController { var myClosure: (() -> Void)? func myFunction() { myClosure?() } } class SecondView..

Swift

[Swift] 'textView(_:shouldChangeTextIn:replacementText:)' 메서드 두 번 호출 버그

안녕하세요, 오늘은 iOS 16.4 시뮬레이터에서 발견한 UITextView 관련 버그에 대해 알려드리려고 합니다. UITextView의 'textView(_:shouldChangeTextIn:replacementText:)' 메서드가 두 번 호출되는 이상한 현상을 발견하였습니다. 버그 발견 iOS 16.4 시뮬레이터를 사용하여 테스트 중에, 텍스트를 입력하거나 수정할 때마다 'textView(_:shouldChangeTextIn:replacementText:)' 메서드가 두 번 호출되는 문제를 확인하였습니다. 이 메서드는 텍스트 뷰의 텍스트 변경을 관리하는데 사용되므로, 이러한 현상은 예상치 못한 문제를 일으킬 수 있습니다. 초기에는 컴퓨터 키보드로 입력할 때만 문제가 발생한다고 생각하였지만, 아이폰 ..

Swift

[Swift] 메모리 관리: 미소유 참조(Unowned References)

미소유 참조(Unowned References)란? "미소유 참조(Unowned References)"란 Swift에서 객체간의 참조 관계를 표현하는 방법 중 하나입니다. 이는 참조 대상의 참조 카운트를 증가시키지 않고, 참조 대상이 메모리에서 사라지더라도 자동으로 nil로 변하지 않는 특성을 가지고 있습니다. 이러한 점은 약한 참조(Weak References)와 차이점을 가집니다. 그러나 미소유 참조는 반드시 값이 존재한다는 가정하에 사용되므로, 옵셔널이 아닌 변수에 선언됩니다. 이는 미소유 참조가 메모리에서 해제된 인스턴스를 참조하려고 하면 런타임 오류를 발생시키기 이유이기도 합니다. 따라서 미소유 참조를 사용할 때에는 참조 대상이 항상 존재하고, 참조하는 변수나 상수의 수명이 참조 대상의 수명보다..

Swift

[Swift] 메모리 관리: 약한 참조(Weak Reference)

약한 참조(Weak Reference)란 무엇인가? 프로그래밍에서 메모리 관리는 중요한 주제입니다. 특히, Swift에서는 'weak'라는 키워드를 통해 약한 참조를 생성하며, 이는 메모리 관리에 중요한 역할을 합니다. 그렇다면, 'weak' 또는 약한 참조는 어떤 개념인지, 어떻게 활용하는 것인지 살펴보겠습니다. 'weak'는 Swift 언어에서 약한 참조를 생성하는 키워드입니다. 이는 순환 참조를 방지하는데 활용되며, 참조하는 객체가 메모리에서 해제되면 자동으로 nil이 됩니다. 이렇게 함으로써 참조 카운트가 0이 되지 않아 메모리에서 해제되지 않는 순환 참조 문제를 해결할 수 있습니다. 약한 참조를 활용한 코드 예시 및 분석 이제는 약한 참조를 활용한 실제 코드를 통해 자세히 살펴보겠습니다. 이를 ..

Swift

[Swift] 메모리 관리: 순환 참조

순환 참조란 무엇인가? 순환 참조는 간단히 말해서, 두 개 이상의 클래스 인스턴스가 서로를 '놓지 않는' 상황을 말합니다. 이 때문에, 인스턴스들은 메모리에서 해제되지 않게 됩니다. 스위프트에서는 메모리 관리를 위해 ARC(Automatic Reference Counting)라는 시스템을 사용합니다. ARC는 이름에서 알 수 있듯이, 인스턴스가 얼마나 많이 참조되는지 세어주는 역할을 합니다. 만약 이 참조 횟수가 0이 되면, 해당 인스턴스는 더 이상 필요 없다고 판단되어 메모리에서 해제됩니다. 그러나 순환 참조가 발생한 경우, 두 인스턴스는 서로를 계속 강하게 참조하고 있기 때문에 참조 횟수가 절대 0이 될 수 없습니다. 그 결과 이들 인스턴스는 메모리에서 해제되지 못하고 계속 남아 있게 됩니다. 이런 ..

웅이코
웅이코는딩딩해