iOS 53

Swift - Copy On Write(COW) 동작 방식

Copy on Write를 알아보기 전에 학교에서 C언어를 배울 때 지겹도록(?) 들었던 Call-by-Value Call-by-Reference 위 두 가지를 복습 차원으로 알아보자 Call-by-Value 영어 뜻을 직역으로 해석하자면 값의 호출인데 느낌 상 알 수 있듯이 값을 호출할 때 데이터를 복사하여 호출한다는 것이다. 예를 들어 int a = 1; int b = a; b = 3; printf("%d",a);// 1 printf("%d",b);// 3 다음과 같이 호출한다면 변수 a에 1을 메모리에 저장하고 그 값을 b에 저장하는 경우 같은 공간을 가리키는 것이 아닌 메모리에 새로운 공간을 할당하여 값을 복사하게 된다. 따라서 b의 값을 3으로 변경하게 되면 b의 값은 3으로 변경되지만 a의 값..

iOS/Swift 상식 2023.01.23

UIKit에서 SwiftUI Preview 사용하기

UI를 코드로 작성할 때 매번 시뮬레이터를 실행하기 매번 번거롭다. 그럴 경우 Preview를 사용하여 내가 작성한 코드를 쉽게 볼 수 있다. □ 코드 1 import SwiftUI #if DEBUG extension UIViewController { private struct Preview: UIViewControllerRepresentable { let viewController: UIViewController func makeUIViewController(context: Context) -> UIViewController { return viewController } func updateUIViewController(_ uiViewController: UIViewController, context:..

iOS 2023.01.19

MVVM 패턴 적용

아이디, 비밀번호를 입력했는지 감지하는 기능 사용한 라이브러리: UIKit, SnapKit, RxSwift, RxCocoa (storyboard 사용 X) 설명: 아이디 비밀번호를 입력한 경우 버튼 문구가 '로그인'으로 변경된다. 둘 중 하나라도 입력하지 않은 경우 '정보 부족'을 출력한다. □ View import UIKit import SnapKit import RxSwift class ViewController: UIViewController { /* UI 생성 코드 */ //ID Label lazy var IdLabel: UILabel = { let l1 = UILabel() l1.font = .systemFont(ofSize: 20) l1.text = "아이디" return l1 }() // P..

iOS/MVVM 2023.01.18

RxSwift 사용

RxSwift RxSwift는 데이터가 Stream 방식으로 흘러간다. Observer Observable안에 있는 내부 인스턴스들로 Observable의 값에 변화가 있을 때 Observer에게 알림이 가고, 등록한 Closure 실행 Subject Observable과 Observer의 성격을 모두 가지고 있는 Protocol (이벤트 방출과, Subscribe를 이 타입 하나로 모두 가능) subject 없이 이벤트 처리를 한다면 observer, Observable 두개 타입이 필요 Observable은 1:1로 이벤트를 방출하지만 1:multi로 이벤트를 여러 Observer에게 송신 Observable RxSwift에서 제공하는 "나중에 생기는 데이터" 타입의 이름 Observer 인스턴스를 ..

iOS/RxSwift 2023.01.14

Swift - Class 성능 향상 시키는 방법

final을 붙이면 성능이 향상된다. 왜??? 이유를 알기 위해서는 Dispatch라는 것을 알아야 한다. Dispatch 내가 호출할 함수를 컴파일 타임에 결정하냐, 런타임에 결정하냐에 따른 방식이다. StaticDispatch (Direct Call) 컴파일 타임에 호출되니 함수를 결정하고 런타임에 그대로 실행된다. 컴파일 시간에 결정되기 때문에 성능상 이점이 있다. Dynamic Dispatch (Indirect Call) 런타임에 호출될 함수를 결정한다. swift는 클래스마다 함수 포인터들의 배열인 vTable이라는 것을 유지한다. 하위 클래스가 메서드를 호출할 때, vTable을 참조하여 실제 호출할 함수를 결정한다. 위와 같은 과정이 런타임에 발생하기 때문에 성능상 손해를 보게 된다 Refe..

iOS/Swift 상식 2023.01.07

iOS - Storyboard vs Code

StoryBoard 장점 - 결과물 예층 쉬움, 속성 쉽게 확인 가능 - 쉽게 UI 생성 가능 - pop, push, present, dismiss등의 코드를 사용하지 않아도 됨 단점 - 화면 로딩 시 무거움 - 링크가 끊어진 경우 파악하기 힘듬 - 협업 문제 발생 가능 ( 오류가 발생한 경우 파악하기 힘듬) - 데이터 흐름이 표시되지 않음 - 앱이 커지면 가독성이 떨어짐 Code 장점 - 가볍다 - 협업 하기 편리하다 - 모든 UI요소에 제어감각이 생긴다. - 재사용하기 용이 - Launch Screen을 제외한 모든 코드가 코드로 구현 가능하다. - 스토리보드는 및 nib는 loading 및 parsing 오버헤드에 영향을 받는다. 단점 - 해당 컴포넌트를 숙지해야 함 - 어떤 화면이 만들어질지 파악..

iOS/Swift 상식 2023.01.07

Autolayout 제약걸기 (코드 - 1)

□ 버튼 생성 및 제약 걸기 let btn1: UIButton = .init(frame: .init()) btn1.backgroundColor = .yellow btn1.setTitle("안녕하세요", for: .normal) btn1.setTitleColor(UIColor.black, for: .normal) self.view.addSubview(btn1) btn1.translatesAutoresizingMaskIntoConstraints = false // false - AutoLayout을 따르겟다 // true - frame을 따르겠다. btn1.topAnchor.constraint(equalTo: self.view.topAnchor,constant: 100).isActive = true btn1..

iOS/AutoLayout 2023.01.07

Intrinsic Content Size, Priority

Intrinsic Content Size 컨텐트의 본질적인 크기를 의미한다. 다음 표를 보면 쉽게 이해할 수 있다. Label, Button, Switch, TextField는 본질적인 크기를 가지고 있어서 오토레이아웃을 지정하는 경우 에러가 나지 않는다. Priority Hugging Priority 두 오브젝트 중 한 오브젝트가 커져야 하는 상황일 때 우선순위가 낮은 오브젝트는 Instrinsic size를 유지하지 않고 커진다. Compression Resistance Priority Hugging Priority와 반대되는 상황이다. 한 오브젝트가 크기 및 내용이 너무 길어서 다른 오브젝트 영역을 넘어갈 때 둘의 우선순위가 같아서 어떤 오브젝트를 줄여야 할지 모를 때 사용한다. 해당 우선순위가 높..

iOS/AutoLayout 2023.01.07

Frame vs Bounds

Frame Super View 좌표계에서 View의 위치와 크기를 나타냄 FirstView의 SuperView는 루트 View가 된다. SecondView의 SuperView는 FirstView이다. (클래스 상속할 때 슈퍼클래스와 같은 Super 같다) frame origin(x, y) frame의 origin(x, y) 좌표는 SuperView의 원점을 (0,0)으로 놓고 원점으로부터 얼마나 떨어져 있는지 나타낸다. SuperView의 원점은 왼쪽 맨 위에 해당한다. 그래서 frame의 origin좌표는 SuperView에서 x, y 만큼 떨어져 있다고 표현할 수 있다. □ frame origin 좌표 변경한 경우 secondView의 frame origin 좌표를 변경하는 경우 thirdView도 ..

iOS/AutoLayout 2023.01.07