일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Swift
- World
- 부스트캠프
- Opensource
- Tistory
- Design Pattern
- 후기
- 디자인패턴
- rxswift
- 알고리즘
- Algorithm
- notion
- Hello
- 단위 테스트
- 네이버 부캠
- Cocoa Internals
- development
- 커스텀 뷰
- boostcamp
- 코코아 인터널스
- WWDC
- 부트캠프
- OS
- 개발
- IOS
- SwiftUI
- Today
- Total
목록Cocoa Internals (7)
꿈돌이랜드
9.1 타입 시스템스위프트 타입 시스템은 자바스크립트나 파이썬처럼 자유로운 덕 타입 시스템이 아니라 명시적인 타입 시스템이다. 오브젝티브-C 처럼 모든 객체가 다이내믹 타입은 아니지만 프로토콜 타입을 활용해서 다이내믹하게 확장하면서도 오브젝티브-C보다 안전하게 쓸 수 있다.9.1.1 스위프트 타입스위프트에는 크게 두 종류의 타입이 있다. 이름 있는 타입(named type)과 이름 없이 합쳐진 타입(compound type)이다. 이름 있는 타입은 클래스, 구조체, 열거, 프로토콜 같은 타입의 이름이 미리 정해진 형태를 말한다. 기존 타입을 상속, 확장해서 나만의 이름을 주고 새로운 타입으로 지정할 수도 있다. 라이브러리에 포함하고 있는 배열, 사전, 옵셔널 타입도 모두 이름 있는 타입이다. 오브젝티브-..
…중략…8.2 스위프트 클로저클로저는 접근 가능한 특정 범위(scope) 내에서 사용하는 값을 (함수 내부에) 갖고 있는 함수를 의미한다. 스위프트에서 함수는 모두 클로저다. 그리고 스위프트에서 클로저는 함수이거나 이름 없는 그냥 클로저 중 하나다. 일부 스위프트 함수는 오브젝티브-C 블록 객체 형태로 호환 가능하다. 반대로 블록 객체는 스위프트에서 클로저처럼 호환성을 유지하면서 호출할 수 있다.8.2.1 클로저 형식…중략…스위프트에서 함수는 당연히 다른 함수의 인자 값으로 사용할 수 있다.…중략…참조 범위가 전체인 글로벌 함수는 이름은 있지만 캡처하는 변수가 없는 클로저가 된다. 다른 함수 내부에 선언한 중첩 함수는 감싸고 있는 함수 범위에 접근 가능한 변수들을 캡처하는 이름 있는 클로저가 된다. 마지..
7.1.1 두 단계 초기화 패턴초기화 과정코코아 프레임워크의 객체들을 포함해서 NSObject에서 상속받은 모든 클래스의 인스턴스가 만들어지기까지는 두 단계에 걸쳐서 초기화가 이루어진다.Pen *aPen = [[Pen alloc] init];첫 번째 단계에서 Pen 클래스에 alloc 메시지를 보내서, 힙 공간에 객체 인스턴스 메모리 공간을 할당한다. 두 번째 단계에서는 객체 인스턴스에 init 메시지를 보내서 객체 인스턴스 속성이나 내부에 필요한 객체나 값을 초기화한다. …중략… 1단계에서 메모리 할당이 되지 않으면, 2단계 초기화 과정은 진행이 불가능하다.…중략두 단계 초기화를 한 단계로 줄여서 사용하기 위해 간편한 메서드를 클래스 메서드로 제공하기도 한다.Pen *aPen = [Pen new];이 ..
🪙코코아 프레임워크 객체는 크게 두 가지로 분류할 수 있다. 하나는 객체를 초기화한 이후에는 내부 데이터를 변경할 수 없는 불변 객체이며, 다른 하나는 변경이 가능한 가변 객체다. 예를 들어 문자열을 다루는 NSString 클래스는 문자열을 바꿀 수 있는 인터페이스가 없는 불변 객체다. 가변 객체를 사용하려면 NSMutableString 클래스로 객체 인스턴스를 생성해야 한다.5.1.1 불변 객체의 특징불변 객체들은 다음과 같은 특징을 가진다.초기화 이후 객체 내부의 값이나 상태가 변하지 않는다.불변 속성 때문에 여러 객체에서, 여러 스레드에서 참조해도 안전하다.값이 바뀌는 상황을 고민하지 않기 때문에 설계가 쉽고 구현하기 수월하다.객체 내부에 모순된 상태가 줄어들어 부작용이 적다.…중략불변 객체를 사용..
4.1 NSCopying 계열 프로토콜코코아 프레임워크에서는 객체를 복사하기 위한 방법으로 또는 프로토콜을 지정해서 필요한 메서드를 구현하는 방법을 권장한다. 프로토콜은 객체를 복사하기 위해 클래스에 미리 구현해야 하는 복사용 메서드 목록을 지정해놓은 프로토콜이다. 애플이 만든 코코아 객체는 이미 프로토콜을 기반으로 만들어져 있어서 객체를 복사하기 쉽다. 프로토콜과 프로토콜 차이는 복사한 객체가 변경 가능한 객체인지 아닌지에 따라 달라진다.4.1.1 복사만 가능한 객체 프로토콜은 구현해야 할 메서드가 딱 하나뿐이다. 내가 만든 객체가 복사 가능한 객체여야 한다면 프로토콜을 선언하고 다음 메서드를 구현하면 된다.-(id)copyWithZone:(NSZone*)zone; // Objective-Cfunc c..
2.1 메모리와 객체운영체제가 관리하는 프로세스는 이론적으로 32bit인 경우 4GB까지의 크기를 가지는 가상 주소 공간에 접근할 수 있다. 64bit인 경우 18EB(2^64)까지 가능하다. macOS는 메인 메모리상의 사용하지 않는 공간을 페이지(가상 메모리 단위)로 나눠서 하드 디스크에 백업하는 기능을 제공한다. 반면 iOS는 하드 디스크가 없고 대신 플래시 메모리를 사용하기 때문에 늘 메모리가 부족하기 마련이다. iOS에서 읽고 쓰는 데이터는 프로그램을 실행하는 동안 사라지지 않지만, 사용하지 않는 읽기 전용 데이터는 페이지를 저장하고 메모리상에서 지워 버린다. iOS는 읽고 쓰는 데이터들의 총합이 일정 수준 이상 많아지면 메모리 부족 경고를 보내고, 그래도 부족하면 앱을 강제로 종료시켜서 메모리..
1.1.6 스위프트 오브젝티브-C 호환 객체오브젝티브-C 코드에서 스위프트 객체를 사용하려면 해당 스위프트 객체는 반드시 NSObject를 최상위 클래스로 지정하고 상속받아 만들어야 한다. 그렇지 않으면 스위프트 전용 객체로 동작하기 때문에 오브젝티브-C에서는 사용할 수 없다. 1.2.1 오브젝티브-C 객체와 메모리 구조오브젝티브-C에서 객체 인스턴스는 항상 힙 영역에 만들어지며, 해당 힙 메모리 주소를 스택 영역에 할당한 포인터로 참조해서 접근한다. 포인터 변수에 담긴 메모리 주소와 해당 주소의 객체 인스턴스가 실제로 유효한지를 포인터 주소만으로는 판단할 수 없다. 객체 포인터 변수는 이미 해제된 객체 주소를 저장하고 있는 위험한 포인터(dangling pointer) 일 수도 있다. 그래서 객체에 대..