iOS

iOS/Swift

강한 참조가 사라지면 진짜 ARC가 해제시켜줄까? 에 대한 메모리 실험

참조를 갖고 있지 않을때 UINavigationViewController에서의 PUSH, POP 우선 단순히 UINavigationViewController를 통해 ThirdVC를 push, pop 할 때마다 ThirdVC가 생성 해제 되는 것을 볼 수 있습니다. 메모리를 확인해도 정상적으로 생성되고 없어지는 것을 확인할 수 있습니다. ARC 짱짱! 강한 참조로 연결되어 있을때 PUSH, POP 아래 코드와 같이 FirstViewController의 프로퍼티로 ThirdViewController의 메서드를 가지고 있을 때는 ThirdViewController가 해제될까? class FirstViewController: UIViewController { var handler: (() -> Void)? @..

iOS/Swift

weak, [weak self]를 사용하여 순환참조를 해결하기 + 메모리 영역 확인

순환 참조 방지를 위해 다음과 같이 클로저에서 [waek self]를 사용하여 약한 참조( ARC의 retain을 증가시키지 않는 )를 사용하곤 합니다. 습관적으로 모든 클로저에서 [weak self]를 사용하곤 하였는데 이번 아티클을 계기로 [weak self]를 사용하는 이유와 어느 순간에 사용해야 하는지 다시 한번 제대로 알아봅시다! 순환참조란? 서로 다른 객체가 강한 참조로 서로를 참조하면서 메모리에서 해제되지 못하는 상태로 간단한 예시를 살펴봅시다 class Human { var name: String var pet: Pet? init(name: String) { self.name = name } deinit { print("\(name) 메모리 해제") } } class Pet { var na..

iOS/UIKit

iOS13 이후 AppDelegate와 SceneDelegate

배경 지식 SceneDelegate의 등장 iOS13부터 기존 AppDelegate에서 하던 책임을 SceneDelegate와 AppDelegate에서 나눠 가지게 되었다 multi window의 등장으로 인해 등장한 개념으로 iPad-OS와 함께 등장하였다 UIScene API를 통해 우리는 App UI의 여러 인스턴스를 만들 수 있다 UIScene과 UISceneDelegate 우리는 이제 여러 인스턴스 UI를 동시에 실행시킬 수 있다 AppDelegate는 더 이상 UI 설정과 foreground, background와 같은 UI 라이프사이클 이벤트를 책임질 필요가 없다 App UI 인스턴스는 UIScene 객체로 표현된다 UIApplication 이 AppDelegate를 통해 notify 하는 ..

iOS/Swift

[Swift] Subscript 알아보기 :: String에서는 subscript를 사용할 수 없는 이유

서브스크립트란 Swift에서 콜렉션, 리스트, 시퀸스 등 집합의 특정 멤버 엘리먼트에 대괄호를 사용하여 간단하게 접근할 수 있는 문법입니다. 만약 직접 서브스크립트를 구현하려면 다음과 같이 형식을 통해 구현할 수 있으며 오버로딩 또한 지원합니다. subscript(index: Int) -> Int { get { // 적절한 반환 값 } set(newValue) { // 적절한 set 액션 } } String에서 서브스크립트 사용? 결론부터 말하면 Swift에서 String은 가변의 크기를 가지기 때문에 Int기반의 인덱스 참조가 불가능합니다. 저번 포스트에서 알아봤듯이 String은 무엇으로 구성되어 있을까? [Swift] 문자열은 무엇으로 구성되어 있을까? - Extended Grapheme Clust..

iOS/Swift

[Swift] AnyObject란? (런타임 시점에 결정된다)

AnyObject 정의 모든 클래스가 암시적으로 준수하고 있는 프로토콜 확인해 보기 모든 클래스가 암시적으로 준수하고 있다 하였으니 개발자가 만들어준 임의의 클래스도 해당 프로토콜을 명시적으로 채택해주지 않아도 AnyObject프로토콜을 준수하고 있는지 확인해 보자 위 코드에서 보았듯이 임의로 만들어준 클래스에서도 is연산자로 Type Checking을 수행해 봤더니 AnyObject프로토콜을 채택하고 있음을 알 수 있다. 마찬가지로 위와 같이 응용하여 서로 다른 클래스를 공통의 타입으로 묶어서 사용하게 할 수 있다. 불편한 점 AnyObject를 사용하여 타입을 지칭하게 되면 모든 클래스 타입을 공통으로 묶어서 사용할 있는 장점도 있지만 Swift의 AnyObject는 어떤 클래스의 인스턴스를 가리키는..

iOS/Swift

[Swift] String과 Substring을 메모리에서 효율적으로 관리하는 방법

SubString이란? Swift에서 문자열(String)에서 일부만 필요에 의해 분리하여 사용하기 위해 prefix(_ : )와 같은 부분 문자열(Substring)을 뽑아내는 메서드를 사용하게 됩니다. 이때 String에서 분리된 문자열은 String 타입이 아닌 Substring 타입으로 따로 정의가 되어 있는데 우리가 사용할 때 굳이 구분하지 않는 이유는 String과 Substring 모두 StringProtocol을 준수하고 있기 때문입니다. (POP의 장점?!) 그렇다면 String에서 분리한 Substring은 메모리에서 어떻게 관리될까? 다음과 예제를 같이 살펴봅시다 let greeting = "Hello, world!" let index = greeting.firstIndex(of: "..

iOS/Swift

[Swift] 문자열은 무엇으로 구성되어 있을까? - Extended Grapheme Clusters

Extended Grapheme Clusters ( 확장된 문자소 클러스터 ) Swift의 String과 Character은 Unicode와 호환됩니다. Swift의 String 타입은 Unicode scalar value로 빌드되며 Unicode scalar value는 character나 수식어를 위한 고유한 21bit 숫자로 이루어져 있습니다. 확장된 문자소 클러스터(extended grapheme cluster)는 사람이 읽을 수 있는 단일 문자로 하나 이상의 Unicode scalar sequence로 구성된 됩니다. 따라서 Swift의 Character 타입의 모든 인스턴스는 하나의 확장된 문자소 클러스터(extended grapheme cluster)로 표기됩니다! let eAcute: Ch..

iOS/Swift

[Swift] Convenience initializer 알아보기

Swift의 Class에서 지원하는 initializer 1. Designated initializer 2. Convenience initializer 3. Required initializer 4. Failable initializer 5. Deinitializers Convenience initializer Designated initializer보다 적은 개수의 파라미터로 편리하게 인스턴스를 생성하기 위한 initializer로 필요해 의해 구현해 사용하며 다음과 같은 특징이 있다. - Convenience initializer는 반드시 다른 Convenience initializer를 호출하거나 Designated initializer를 호출해야 함( 궁극적으로는 Designated initial..

iOS/Swift

[Swift] CoW(Copy on Write)의 동작방식 + 메모리 주소 디버깅

Copy on Write란? Copy on Write는 원본이나 복사본에서의 실제 값 변경이 발생하기 전까지는 같은 값을 가리키고 있다가 실제 값 변경 발생 시 복사를 수행하는 방식으로 Swift는 Collection Type( Array, Set, Dictionary )과 String Type에서 CoW 복사 방식을 사용합니다. 왜 사용해야 하나요? Swift에서는 Value Type의 복사는 깊은 복사 방식을 사용하는데 Collection Type 같은 경우는 Value Type이지만 heap 영역에 생성되어 매번 깊은 복사 방식을 사용하면 높은 메모리 오버헤드를 발생시킬 수 있다. 이를 방지하기 위해 Collection Type의 경우 복사한 데이터의 수정이 발생하지 않는다면 얕은 복사와 같이 he..

iOS/Swift

[Swift] Class의 성능을 향상 시킬수 있는 방법 :: Static Dispatch

1. Static Dispatch를 사용하자 class뿐만 아니라 상속, 오버라이딩 될 필요가 없는 클래스, 메서드, 프로퍼티에 final 키워드를 붙여 Static Dispatch를 통해 성능 향상을 기대할 수 있다.( 저장 프로퍼티의 경우 오버라이딩이 원래 불가하니 의미가 없을 듯 ) Static Dispatch란? 호출할 메서드를 컴파일 타임에 결정하겠다! 런타임때 호출할 메서드를 이미 결정해 놨으니 성능이 좋다! Dynamic Dispatch란? 호출할 메서드를 런타임에 결정하겠다! Swift는 Dynamic Dispatch를 지원하기 위해 클래스마다 함수 포인터들의 배열인 vTable(Virtual Method Table)을 갖고 있다. 하위 클래스가 상위의 메서드를 호출할때 vTable을 런타..

테리펀트
'iOS' 카테고리의 글 목록