Swift

    Swift | Array capacity, reserveCapacity

    Swift | Array capacity, reserveCapacity

    Swift의 모든 배열은 데이터를 저장할 수 있는 특정 양의 메모리를 예약합니다. insert나 append와 같은 추가 작업에 대비하기 위해서인데요. 배열에 요소를 추가할 때 해당 배열이 예약된 용량(capacity)을 초과하기 시작하면 배열은 더 큰 메모리 영역을 할당하고 해당 요소를 새 메모리에 복사합니다. 새 메모리의 크기는 이전 메모리 크기의 배수입니다. capacity를 초과해서 append 될 때마다 2배로 늘어나고 있습니다. 새 메모리를 할당할 때마다 성능이 문제되는거 아냐? 하겠지만 우리는 재할당에 대한 비용을 걱정하지 않아도 됩니다! 왜냐하면 이렇게 두배씩 증가하는, 기하급수적으로 메모리를 증가시키는 전략을 사용하기 때문입니다! 배열 크기가 커질수록 재할당 빈도는 줄어들게 되겠죠? 그런..

    Swift | 강한 참조와 약한 참조! 순환 참조 사이클 해결방법

    Swift | 강한 참조와 약한 참조! 순환 참조 사이클 해결방법

    🦖 Strong Reference Cycle이란? class Person { var name = "Ahyeon" var car: Car? deinit { print("person deinit") } } class Car { var model: String var lesee: Person? init(model: String) { self.model = model } deinit { print("car deinit") } } Person class는 Car 속성, Car class는 Person 속성을 가지고 있다. var person: Person? = Person() var rentedCar: Car? = Car(model: "Benz") person과 rentedCar는 각각의 Person, Car 인..

    Swift | 코코아 메모리 관리 모델, ARC

    Swift | 코코아 메모리 관리 모델, ARC

    🔖 코코아의 메모리 관리 모델 Stack에 저장된 데이터는 자동으로 제거되기 때문에 특별한 관리가 필요없다. 하지만 Heap에 저장된 데이터는 필요하지 않은 시점에 직접 제거해야 한다. 메모리 관리 모델은 힙에 저장되는 데이터를 관리한다. 다시 말하면 클래스 인스턴스의 메모리를 관리한다. 따라서 이번 포스트에서 언급하는 인스턴스는 모두 클래스 인스턴스 이다. Objective-C는 MRC, ARC, Swift는 Objective-C와 동일한 메모리 관리모델인 ARC를 사용한다. 관리모델이 언어에 속하는 건 아니고 애플이 제공하는 개발 환경인 코코아에 속해있다고 보는 것이 정확하다. 메모리 관리모델을 이해하기 위해서는 소유 정책(Ownership Policy) 와 참조 카운트(Reference Count)..

    Swift | 구조체와 클래스의 차이

    Swift | 구조체와 클래스의 차이

    Structures and Classes Swift에서 구조체와 클래스에는 많은 공통점이 있습니다. 값을 저장할 수 있는 프로퍼티 정의 기능을 제공하는 메소드 정의 값에 대한 액세스를 제공하도록 서브스크립트 정의 초기 상태를 설정하기 위한 이니셜라이저 정의 기본 구현 이상으로 기능을 확장하는 익스텐션 특정 종류의 표준 기능을 제공하는 프로토콜 준수 하지만 클래스에는 구조체에 없는 추가 기능들도 있습니다. 상속을 통해 한 클래스가 다른 클래스의 특성을 상속할 수 있습니다. 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있습니다. Deinitializer 를 사용하면 클래스의 인스턴스가 할당된 리소스를 해제할 수 있습니다. Reference counting 은 클래스 인스턴스에..

    Swift | 클로저

    Swift | 클로저

    클로저는 정의된 컨텍스트에서 모든 상수 및 변수에 대한 참조를 캡처하고 저장할 수 있습니다. 공식문서의 표현에 따르면 클로저는 상수와 변수를 닫는 것(close)이라고 하네요. 그래서 이름이 클로저가 됐나봐요. 그래서 닫는게 뭐냐?! 참조를 캡처하는게 뭐냐?! 에 대해 이해를 해보도록 하겠습니다. 우선 스위프트에서 클로저에 포함되는 것은 세 가지 종류가 있습니다. Global Function : 이름이 있고 값을 캡처하지 않는 클로저 Nested Function : 이름이 있고 값을 캡처할 수 있는 클로저 (Unnamed) Closure : 이름이 없고 주변 컨텍스트에서 값을 캡처할 수 있는 구문 Global Function과 Nested Function(함수 내부에 정의된 함수, 중첩함수)처럼 이름이 ..