iOS/Swift
-
[Swift] ARC 알아보기 (Auto Reference Counting)iOS/Swift 2020. 9. 4. 16:29
안녕하세요:) 오늘은 Swift의 메모리 관리 기법인 ARC에 대해 알아보겠습니다. 프로젝트를 진행하다 보니, 기능이 많고 변수들도 많아서 메모리 관리에 신경이 쓰이는 순간이 왔습니다. 그래서 Swift는 메모리 관리를 어떻게 하고 있는지 알아보도록 하겠습니다. 메모리 관리를 왜 해야 할까? 우선 본격적으로 메모리 관리에 대해 알아보기 전에, 왜 알아야 하는지부터 짚고 넘어가겠습니다. 앱의 성능을 유지하기 위해 메모리 관리와 유지는 기본입니다. 메모리 관리가 제대로 일어나지 않으면 Memory Leak, Dangling Pointer 등의 문제가 발생할 수 있습니다. Memory Leak: 사용되지 않는 데이터가 메모리 공간을 차지하고 있는 현상 Dangling Pointer: 이미 메모리 할당이 해제된..
-
Closure (2)iOS/Swift 2020. 4. 17. 03:21
@escaping @escaping 속성은 인자 값으로 전달된 클로저를 저장해 두었다가, 나중에 다른 곳에서도 실행할 수 있도록 허용해주는 속성이다. func callback(fn: () -> Void) { fn() } callback { print("Closure가 실행되었습니다.") } 정의된 함수 callback(fn:)은 매개변수를 통해 전달된 클로저를 함수 내부에서 실행하는 역할을 한다. func callback(fn: () -> Void) { let f = fn // 클로저를 상수 f에 대입 f() // 대입된 클로저를 실행 } 만약 함수를 위와 같이 바꾼다면 오류가 출력된다. 전달된 클로저를 변수에 대입한 후 실행하는 것이 안된다는 것이다. 오류의 내용은 Non-escaping 파라미터인 '..
-
ClosureiOS/Swift 2020. 4. 11. 12:14
클로저 클로저란, 자신이 정의되었던 문맥(Context)으로부터 모든 상수와 변수의 값을 캡처하거나 레퍼런스를 저장하는 익명 함수이다. 전역 함수 이름이 있으며, 주변 환경에서 캡처할 어떤 값도 없는 클로저 중첩 함수 이름이 있으며 자신을 둘러싼 함수(내부 함수)로부터 캡처할 값이 있는 클로저 클로저 표현식 이름이 없으며 주변 환경으로부터 값을 캡처할 수 있는 경량 문법으로 작성된 클로저 클로저 포현식은 간단하게 줄일 수 있다. let c = { (s1: Int, s2: String) -> Void in print("s1: \(s1), s2: \(s2)") } c(1, "closure") 위의 식을 아래와 같이 줄일 수 있다. ({ (s1: Int, s2: String) -> Void inn print(..
-
프로토콜 지향언어, Swift (3)iOS/Swift 2020. 3. 21. 09:11
프로토콜의 상속 프로토콜은 클래스처럼 상속을 통해 정의된 프로퍼티나 메소드, 그리고 초기화 블록의 선언을 다른 프로토콜에 물려줄 수 있다. 하지만 프로토콜은 클래스와 다르게 다중 상속이 가능하다. 즉 여러 개의 프로토콜을 하나의 프로토콜에 한꺼번에 상속하여 각 프로토콜들의 명세를 하나의 프로토콜에 담을 수 있다. protocol A { func doA() } protocol B { func doB() } protocol C: A, B { func doC() } class ABC: C { func doA() { } func doB() { } func doC() { } }위의 코드에서 프로토콜 C는 프로토콜 A와 B를 상속받았기 때문에 C를 구현하는 클래스 ABC에서는 프로토콜 A, B, C를 모두 구현해야..
-
프로토콜 지향언어, Swift (2)iOS/Swift 2020. 3. 14. 11:34
타입으로서의 프로토콜 프로토콜은 그 자체로는 아무런 기능을 구현하고 있지 못하므로 인스턴스를 만들 수 없을뿐더러 프로토콜만으로 할 수 있는 일도 거의 없다. 하지만 프로토콜은 특별히 기능을 부여하지 않더라도 코드 내에서 자료형으로 사용하기에 부족함이 없는 객체이다. 따라서 때로는 타입으로서 중요한 역할을 하기도 한다. 상수나 변수, 그리고 프로퍼티의 타입으로 사용할 수 있다. 함수, 메소드 또는 초기화 구문에서 매개변수 타입이나 반환 타입으로 프로토콜을 사용할 수 있다. 배열이나 사전, 혹은 다른 컨테이너의 타입으로 사용할 수 있다. 특정 프로토콜을 구현한 구조체나 클래스들이 있을 때, 이들의 인스턴스를 각각의 타입이 아닌 프로토콜 타입으로 정의된 변수나 상수에 할당할 수 있다. 프로토콜 타입으로 정의된..
-
프로토콜지향 언어, Swift (1)iOS/Swift 2020. 3. 7. 04:33
Swift는 프로토콜 지향 언어이다. 프로토콜 지향 방식으로 애플리케이션을 설계하는 것은 객체지향 방식으로 설계하는 것과 상당한 차이가 있다. 프로토콜 지향 설계에서는 클래스 계층 구조로 시작하는 대신 프로토콜로 시작해야 한다. 프로토콜은 클래스나 구조체가 어떤 기준을 만족하거나 또는 특수한 목적을 달성하기 위해 구현해야 하는 메소드와 프로퍼티의 목록이다. (객체지향에서의 인터페이스와 거의 비슷하다.) iOS는 특정 컨트롤에서 발생하는 각종 이벤트를 효율적으로 관리하기 위해 대리자(delegate)를 지정하여 이벤트 처리를 위임하고, 실제로 이벤트가 발생하면 위임된 대리자가 콜백 메소드를 호출해주는 델리게이트 패턴(Delegate Pattern)을 많이 사용하는데, 이 패턴을 구현하기 위해 이용되는 것이..