분류 전체보기

    [iOS] 메모리 구조/ARC(Automatic Reference Count)

    [iOS] 메모리 구조/ARC(Automatic Reference Count)

    메모리 구조 Stack 영역 값 타입이 할당된다 함수 호출 시, 지역변수, 매개변수, 반환 값, 파라미터 값 등이 저장된다. 함수 호출이 완료되면 사라진다. -> 메모리를 직접 해제해주지 않아도 된다! 컴파일 시 크기가 결정된다. 메모리가 한정되어있다. 함수도 들어간다. Heap 영역 대체로 참조 타입값(클래스 인스턴스, 클로저)이 할당되지만, 값 타입도 할당될 때가 많다. class안에 struct가 있으면 struct도 class라는 컨테이너 안에 넣어져서 같이 Heap에 할당된다. 유일하게 런타임 시 크기 결정된다. 사용하고 난 후에는 반드시 메모리 해제를 해줘야한다.(memory leak 위험성) -> Swift에서는 ARC가 직접 해준다. 프로그래머가 할당 및 해제를 해줘야된다.(동적 할당) 할..

    [iOS] 의존성 주입

    [iOS] 의존성 주입

    의존성 주입(Dependency Injection) 특정 객체가 필요로하는 것들을 내부적으로 생성하게 두지 않고, 외부에서 제공해주는 것. 인스턴스 생성의 책임을 객체가 스스로 하도록 하지 않고 initializer, peroperty, method parameter의 형태로 “넘겨주는 것” 🤨 왜? 의존성이 높을 경우, 아래와 같은 문제가 있다. 클래스간의 결합도가 높아진다. 자연스럽게 테스트 성도 낮아진다. 코드 재사용성이 낮아진다. 의존성 주입을 해주면 아래와 같은 이점이 생긴다. 객체가 의존성을 받는 시점을 컴파일 타임이 아닌, 런타임으로 늦출 수 있다. 클래스가 생성이 된 후에도 프로퍼티 값등을 변경할 수 있다. 가장 쉬운 의존성 주입 예를 봐보자, 아래와 같이 ViewController 클래스..

    [iOS] Delegate Pattern

    [iOS] Delegate Pattern

    Delegate Pattern 두 개의 클래스 A,B가 존재한다고 가정해보자. 만약 A에서 B의 어떠한 프로퍼티 값을 고치고 싶다면? 혹은 A에서 B로 데이터를 옮기고 싶다면? 우리는 Delegate Pattern을 사용해 볼 수 있다. ☀️ Delegate Pattern 예시(1) Teacher는 cleaningArea 프로퍼티를 가지고 있고, Student는 Teacher의 cleaningArea값을 변화시킨다. 해당 과정을 delegate pattern을 통하여 구현해보자. ViewController간의 데이터 전달이 아닌, 일반 클래스 간의 데이터 전달의 예를 알아보자. 아래와 같은 protocol을 생성해보자. // 청소를 시킬 수 있는 protocol CleanOrderable { var cl..

    [iOS] Queue 구현하기

    [iOS] Queue 구현하기

    💥 Queue 구현하기 Queue를 구현할 경우, 필수적으로 구현해야될 메소드가 몇가지 있다. enqueue dequeue count isEmpty … 일반 array로 구현하는 것보다 double stack으로 구현할 경우 dequeue시, 시간 복잡도면에서 이득을 볼 수 가 있다. ☀️ Array를 통한 Queue 구현 일반 array로 queue를 구현해보면 아래와 같이 구현할 수 있다. struct QueueArray: Queue { private var array: [T] = [] var isEmpty: Bool { return array.isEmpty } var peek: T? { return array.first } mutating func enqueue(_ element: T) { arra..

    [Swift] 메타타입

    [Swift] 메타타입

    HTML 삽입 미리보기할 수 없는 소스 💥 메타 타입 타입의 타입을 뜻한다. 우리가 알고 있는 타입은 메타타입의 인스턴스이다* 위의 내용을 표로 정리해보면 아래와 같다. 메타타입 String.type 메타타입의 인스턴스(타입) String.self 타입의 인스턴스 “Miro” - 예를 통해서 표의 내용을 이해해보자. 아래는 Class를 정의하고 해당 클래스의 인스턴스를 생성해주는 코드이다. class Human { var: name = "Miro" } let miro: Human = Human() miro 상수와 같이 Human 타입이라고 선언했을 경우, Human 타입의 instance를 넣어준다. 그렇다면 아래와 같은 코드일 경우, 메타타입의 instance(Human.self)를 넣어주어야됨을 알 ..

    [Swift] Generic

    [Swift] Generic

    💥 Generic(제네릭) 타입에 의존하지 않는 범용 코드를 작성할 때 사용된다. 🌟 제네릭 함수 만약 내가 인자로 들어오는 int값을 서로 swap하는 함수를 만든다고 가정해보자. 그러면 아래와 같이 함수 코드를 작성할 있다. func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tempA = a a = b b = tempA } 그리고, 만약 내가 String값을 서로 swap하는 함수를 만든다고 가정을 한다면? func swapTwoStrings(_ a: inout String, _ b: inout String) { let tempA = a a = b b = tempA } 즉, 위와 같이 type 별로 같은 기능을 하는 함수를 만들어줘야된다. 그러나, 아래..

    [Swift] map 삼형제(map, compactMap, flatMap)

    [Swift] map 삼형제(map, compactMap, flatMap)

    map 아래와 같이 각 요소에 대한 값을 변경할 때 사용이 된다. 배열의 형태로 반환이된다. func map(_ transform: (String) throws -> T) rethrows -> [T] [Swift] - 고차함수(Map,Filter,Reduce), allSatisfy, forEach compactMap map을 해주는 동시에 nil을 제거하고 옵셔널 바인딩을 해준다. func compactMap(_ transform: (Int?) throws -> ElementOfResult?) rethrows -> [ElementOfResult] flatMap map을 해주는 동시에 nil을 제거하고 옵셔널 바인딩을 해준다. 중첩된 배열을 제거한다. 1차원 배열로 flatten하게 해준다. func fl..

    [Swift] Protocol

    [Swift] Protocol

    💥 프로토콜(Protocol) 기능에 적합한 메서드, 프로퍼티 등에 대한 청사진이다. 클래스, 구조체, 열거형이 채택을 한다. 약속 채택, 준수, 실체화 🌟 프로토콜 정의 구체적인 구현은 채택한 type이 해준다. protocol SoccerTeam { var striker: String { get set } var midfielder: String { get set } var defender: String { get set } var goalKeeper: String { get set } func play(sports: String) -> String { } } 🫧 프로토콜 프로퍼티 선언 연산 프러퍼티 & 저장 프러퍼티 둘 다 가능하다. 연산 프러퍼티 ⇒ 무조건 var로 선언 저장 프러피티 ⇒ get,..

    [iOS] Priority(Autolayout)

    [iOS] Priority(Autolayout)

    Priority UILayoutPriority 는 0~1000의 값을 가진다. .required == 1000 .defaultHigh == 750 .defaultLow == 250 lessThanOrEqualTo 나 greaterThanOrEqualTo 는 다른 제한조건과 같이 쓰인다. 만약 다른 제한조건이 없다면 equal로 간다! 아래의 경우, 아이폰 X과 SE(8)의 safe area의 차이를 보여주는 그림이다. SE는 safe area의 bottom과 super view의 bottom이 같음을 알 수 있다. 위의 두 아이폰 기종을 통하여 priority에대해 이해를 해보자. 먼저 아래의 코드는 button을 view에 추가하고 leading, trailing만 safe area에 맞춰준 상태이다...

    [iOS] prepareForReuse()

    [iOS] prepareForReuse()

    prepareForReuse() tableView를 구현 시, reusableCell을 dequeue할 때 생기는 문제를 해결하는 방법! 먼저, dequeueReusableCell 은 아래의 그림과 같은 과정으로 진행이된다! 이럴 경우, line2에 설정된 attribute이 그대로 line6에 적용이될 수 있다. 이런 문제를 해결하기 위해서는, cell이 reuse되기 전에 prepareForReuse()을 통하여 매번 cell을 초기화해주면 된다. 예제 코드 tableview가 존재하고, 해당 tableview는 custom cell인 ReuseCell을 가지고 있다. 해당 tableview는 두 가지의 조건이 있다. row가 0일 경우 cell의 background color를 빨간색으로 설정하고,..

    [iOS]  TableView의 reloadData()란?

    [iOS] TableView의 reloadData()란?

    💥 reloadData()란? tableView의 인스턴스 메소드 테이블 뷰의 현재 보이는 전체 열(row), 섹션(section)을 업데이트할 때 사용한다. 특정 열, 섹션 등 부분적인 업데이트가 아닌, 전체 영역을 업데이트할 때 유리하다. 🌟 reloadData()의 과정 reloadData()호출 numberOfItemsInSection 메소드에서 cell의 갯수를 결정한다. cellForItemAt 메서드에서 cell을 화면에 보여질만큼의 셀을 생성한다. ‼️ 주의사항 tableView의 row를 제거하고, 삽일할 때는 사용하면 안된다❌ 일부만 업데이트를 할 경우, reloadRows(at:with:), performBatchUpdates(_:completion)을 사용한다. 해당 메소드는 UI를..

    [iOS] iOS 프로젝트 파일 폴더링

    [iOS] iOS 프로젝트 파일 폴더링

    iOS 프로젝트 파일 폴더링 정해진 법칙은 없기에, 속한 조직이나 나 자신이 보기 편하게 폴더링을 하는게 중요하다! 아래의 구조를 따른다. 📂 Resources SceneDelegate AppDelegate Assets Constants Extensions Fonts 📂 API관련 파일 📂 Storyboards launchScreen 📂 Sources 📂 ViewControllers 📂 Models 📂 Network 📂 Classes 📂 Protocols 📂 Cells 📂 Designs 📄 Info.plist

    [iOS] ViewController life cycle (feat. push(pop), present(dismiss) )

    [iOS] ViewController life cycle (feat. push(pop), present(dismiss) )

    ViewController Life Cycle loadView 뷰컨이 관리하는 뷰를 만들 때 호출된다. 현재 뷰가 없을 때 호출하고, 뷰가 다 만들어지면 해당 뷰를 뷰컨의 뷰로 설정한다. viewDidLoad View Controller가 생성될 때 처음 한 번만 호출된다.(VC의 라이프 사이클에서 한번 호출) 뷰컨의 뷰가 메모리에 올라가고 난 뒤에 호출된다. 해당 메소드는 Bounds가 결정되거나, 회전이 일어나기 전에 호출된다. viewWillAppear View 계층 구조에 추가되기 직전 다른 뷰에 갔다가 다시 돌아오는 상황에서 호출이된다. Bounds가 결정되고 난 후에 호출이된다. viewIsAppearing 메인 뷰의 레이아웃과 뷰 trait collection들이 업데이트 된 후 직후입니다...