-
COW(Copy-on-Write) 를 알아보자iOS/🟠 Swift 2022. 12. 29. 23:34
Copy-on-Write 값을 실제로 쓸 때 (on-write) 복사한다(copy) 실제 복사를 늦추어 힙 할당을 줄이는 최적화 방법 Usecases 1. Swift Collection : Array, Dictionary, String 등 2. 3-word 가 넘는 struct 를 Protocol 타입으로 다룰 때 값 타입과 힙 영역의 관계 Array 나 String 은 스위프트에서 값 타입 입니다. 값 타입 인스턴스는 기본적으로 스택 영역을 할당하고 그 곳에 값을 초기화하는 것으로 알려져 있습니다. 그러면 값 타입과 힙 영역은 어떤 관련이 있을까요? Arrray, String 등 Collection 을 활용하는 특정 값 타입들은 런타임에 element 의 추가, 삭제가 가능하기 때문에힙 영역 데이터를 ..
-
[iOS] UITextField 에 붙여넣기를 방지하기iOS/🤖 App 2022. 11. 3. 23:26
숫자만 입력해야하는 필드가 있다고 가정해보자. 이 때, 붙여넣기를 통해 문자가 입력되는 것도 방지해야 할 것이다. 붙여넣기로 문자가 입력된 이후에 감지해서 제거하는 방법도 있겠지만, 붙여넣기 자체를 아예 불가능하게 만들 수도 있다. UITextField 에 붙여넣기를 방지해보자. 사용자는 UITextField 를 탭하여 아래와 같은 UI 를 화면에 띄울 수 있다. 이것을 editing menu 라고 부른다. 그리고 editing menu 가 등장하기 직전에 호출되는 메서드가 있다. canPerformAction(_:withSender:) 이다. 이 메서드는 UIResponder 에 정의되어있다. UITextField 는 UIResponder 를 상속한 클래스이므로, 사용자가 TextField 를 탭할 때..
-
Main event loop 란?iOS/🍎 Documentation 2022. 9. 16. 23:55
세 줄 요약 main thread’s run loop 이 곳에 설치되어 있는 input source 를 통해 사용자의 저수준 이벤트가 들어온다. 이 곳에서 application 은 이벤트 큐에서 받아온 이벤트를 처리한다. run loop 란? run loop 는 두 가지 작업을 하는 event-processing 루프임. 작업을 스케줄링한다. 해당 run loop 에 설치되어 있는 input source 들로부터 나오는 이벤트들을 조정한다. 모든 쓰레드는 각자의 run loop에 접근할 수 있다. main event loop main event loop 는 메인 쓰레드를 위한 run loop 이고, application object 에 의해 자동적으로 동작한다. 이 루프에서 application 은 들어..
-
[UIKit] .xib 사용하기iOS/🛠 이슈와 궁금증 2022. 5. 30. 22:05
안녕하세요 🥷🏻 이번 시간에는 xib 사용법을 정리하려고 합니다. 예시가 되는 상황은 다음과 같습니다. 붉은 색 사각형의 UIView 와 "RED" 라는 UILabel 을 서브뷰로 가지는 UIView 를 재사용하기 위해 RedView.xib 와 RedView.swift 파일을 만들었습니다. 이 xib 를 다른 곳에서 사용하고 싶다면? 크게 두가지 방법이 있습니다. 1. xib 파일의 File's Owner 에 커스텀 클래스를 등록하여 사용하기 2. xib 파일의 뷰에 커스텀 클래스 를 등록하여 사용하기 방법 1. File's Owner 에 커스텀 클래스를 등록하여 사용하기 1. xib 파일의 File's Owner 에 커스텀 클래스를 등록합니다. 2. xib 를 사용할 스토리보드에 UIView 를 원하는..
-
[WWDC 20] Embrace Swift Type InferenceiOS/👨🏻💻 WWDC 와 테크세미나 2022. 5. 23. 01:01
안녕하세요 🥷🏻 이번 시간에는 WWDC 20: Embrace Swift Type Inference 영상을 요약해보았습니다. 그럼 시작해볼게요! 영상의 구성 - Leveraging type inference - How type inference works in compiler - Using Swift and Xcode to fix compiler errors Leveraging type inference 타입 추론을 사용하면 중복되거나 덜 중요한 정보(verbose, incidental) 를 코드에 담지 않을 수 있게 됩니다. 따라서 코드가 깔끔해지고, 생산성이 증가합니다. let text = "" 위의 타입 추론 예시는 아주 간단합니다. "" 라는 String literal 을 통해 컴파일러는 text ..
-
[WWDC 21] ARC in Swift: Basics and beyondiOS/👨🏻💻 WWDC 와 테크세미나 2022. 5. 15. 17:35
요약 👀 ARC 는 오브젝트(인스턴스)의 life time이 끝날 때 deallocate 해준다. 그렇다면 ARC 는 오브젝트의 life time 이 끝난지 어떻게 알수 있는 것일까? Referecne count 를 추적한다. ARC 최적화에 의하여, observed obejct life time 과 guaranteed mininum object life time 이 다를 수 있다. Observed object life time 은 미래에 스위프트 컴파일러 구현에 따라 변동 될 수 있으니, 이것에 의존하는 코드는 잠재적 버그를 포함한 것이므로 가능한 수정해야한다. 키워드 중심 정리 💎 object life time 스위프트에서 object life time 은 사용 기반 ( use-based ) 이다. ..
-
[Design Patterns] 옵저버 패턴이란?General/🟢 General 2022. 2. 18. 00:01
키워드 : 옵저버, 구독, 이벤트, 알림, 폴링 옵저버는 Subscriber, Listener 등으로도 불립니다. 옵저버는 이벤트가 발생하면 수행할 동작을 정의해놓고 옵저버블을 감시, 구독합니다. 옵저버블은 자신을 구독하려는 옵저버를 등록하고 (register) , 이벤트가 발생했을때 등록된 옵저버들에게 알려줍니다.(notify) 위와 같은 방식으로 옵저버는 이벤트에 바로 반응할 수 있습니다. 폴링이라는 개념과 비교하여 이해해볼까요? 폴링은 옵저버블이 옵저버에게 알려주는 대신, 옵저버가 직접 이벤트가 발생하는지 주기적으로 감시하는 방법을 사용합니다. ( for , while 등을 떠올리면 됨 ) 하지만 주기가 아닐때 발생한 이벤트를 알지 못하고, 발생하지 않을 때도 자원을 점유하고 있기 때문에 오버헤드가..
-
[SOLID] 의존관계 역전 원칙이란?General/🟢 General 2022. 2. 17. 23:46
Dependency inversion principle 고수준의 모듈이 저수준의 모듈에 직접 의존하지 않고, 인터페이스에 의존한다. 저수준의 모듈도 이 인터페이스를 의존한다. 저수준의 입장에서 의존 받는 입장에서 의존 하는 입장으로 관계가 역전된다. 처음보면 이해가 잘 가지 않습니다. 아래 설명을 한번 볼까요? High Level Module 과 Low Level Module 보통 더 많은 정보를 가지고 있으면 하이레벨 ( 동물원 ) 상대적으로 적은 정보를 가지고 있으면 로우레벨이라고 설명합니다. (동물들) 정리하자면 동물원은 펭귄, 사자, 코끼리에 의존하고 있습니다. 이것이 보통은 자연스러운 관계입니다. 하지만 ... 프로그래밍 세계에서는... 양이나 소, 토끼 등 동물들이 계속 추가되면 동물원은 더 ..
-
[Swift] if case let 를 사용하여 불필요한 코드 줄이기iOS/🟠 Swift 2022. 1. 16. 21:53
안녕하세요🐶 이번 시간에는 if case let 패턴을 사용해 switch-case 구문의 boiler plate 를 줄여보도록 하겠습니다. 언제 쓰는가? 열거형을 처리할 때 보통 저는 switch-case 를 사용했었습니다. 단일 case 만을 처리하고 싶어도 같은 방법을 사용했습니다. 떡볶이 열거형을 예로 한 번 들어보자면: enum 떡볶이 { case 일반 case 치즈 } let 내떡볶이 = 떡볶이.치즈 switch 내떡볶이 { case .치즈: 치즈토핑얹기() case .일반: break; } 만약 더 많은 케이스가 있는데 하나만 처리하고 싶은 경우라면, default 문을 사용할 수도 있습니다. switch 내떡볶이 { case .치즈: 치즈토핑얹기() default: break } 이렇게 단..