본문 바로가기

Swift/Foundation

App Lifecycle 오늘 다룰 내용은 현재 공식문서에서 숨겨진 내용을 포함한다. RunLoop는 무엇일까라는 고민에서부터 출발했고, 여러 블로그 글을 정리해서 작성했다. storyboard를 사용할 때도 시작점을 설정하고, view를 코드로 작성할 때도 시작점을 설정해야 한다. App Lifecycle을 공부하면서 한 번도 main함수에 대해서 생각을 해본 적이 없다. 이 글은 application(_:willFinishLaunchingWithOptions:)을 부르기 전부터 시작한다. start 함수는 화면에서 앱을 실행시킬 때 호출되며 내부적으로 main 함수가 호출된다. Swift만 사용했다면 main 함수를 한 번도 본적이 없을 것이다. objc를 사용했다면 main.m 파일이 있지만, Swift는 아래 코드를 보면.. 더보기
@autoreleasepool applifecycle을 공부하던 중 @autoreleasepool를 발견하고 의문점이 생겼다. autorelease pool는 objc와 연관이 있어서 다른 블로그를 참고하면서 작성했다. int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(...); } } autorelease pool은 객체의 소유권을 포기할 수 있는 메커니즘을 제공하지만 즉시 해제 될 가능성을 방지한다. objc는 Swift와 달리 MRC(Manual Referencing Counting)을 (사용한다) 사용할수 있다. ARC가 나오면서 objc도 MRC가 아닌 ARC를 기본적으로 사용한다. 설정을 변경하면서 프로그래머가 선택할 수 있다. re.. 더보기
POP Swift 2.0으로 업데이트 되면서 Swift는 Protocol Oriented Programming라고 발표했다. 많은 Protocol이 생겼고, 구조체와 클래스에서 프로토콜을 채택하고, 클래스 상속에서 받지 못했던 이점을 챙겼다. 왜 OOP에서 POP로 변경된 건가? OOP는 클래스를 기반으로 상속을 통한 유연함을 유지했다. 하지만 상속은 생각보다 유연하지 못했다. 추상화된 클래스를 구체화했을 때 공통적인 책임을 갖는 여러 클래스가 존재할 수 있고 중복된 코드가 생성된다. 참조 타입을 사용하면서 발생하는 문제들(멀티 스레드 환경에서의 다중 접근, 동적 할당과 참조 카운팅으로 인한 자원 소모)이 있다. 위와 같은 문제점을 해결하고자 Swift 2.0에서는 Protocol + Extension + Ge.. 더보기
Any, AnyObject Any can represent an instance if any type at all, including function types and optional types. AnyObject can represent an instance of any class type. Any는 모든 타입을 말하며, Anyobject는 클래스 타입을 말한다. AnyObject는 모든 클래스가 암시적으로 준수하는 프로토콜이다. NSCache를 사용하면서 들었던 의문점이 생겼다. UIImage는 별다른 변환 없이 사용 가능했고(UIImage는 클래스이기 때문에), URL은 AnyObject로 변환해서 집어 넣줘야 했다. AnyObject는 클래스가 암시적으로 준수하는 프로토콜이라고 정의했는데, 어떻게 URL(Struct)이 변.. 더보기
Properties Stored Properties 인스턴스의 부분으로 저장된다. 클래스와 구조체에서만 사용한다. var가 붙으면 변수이며, let이 붙으면 상수이다. 상수 구조체 인스턴스의 stored properties let someStruct = struct(...) someStruct.value = 4 // value는 변수, 에러가 발생한다. 인스턴스를 할당할 때 상수로 선언하면, 프로퍼티가 변수여도 수정할 수 없다. 이는 구조체가 값 타입이기 때문에 인스턴스가 상수로 선언되면 모든 프로퍼티가 상수로 표시된다. Lazy Stored Properties lazy 변수는 처음 사용되기 전까지는 할당되지 않으며, 호출을 받으면 메모리에 올라간다. 초기 값이 존재하지 않고, 이후에 값이 생성되기 때문에 let으로 선언할.. 더보기
Dispatch Queue 앱 작업을 비동기식으로 수행할 수 있는 GCD 추상화 계층이다. 작업은 항상 queue에 추가된 순서대로 실행된다. Serial, Concurrent serial queue (하나의 스레드) serial dispatch queue는 한 번에 하나의 작업만 수행한다. race condition이 발생하지 않도록 특정 값이나 자원에 대한 액세스를 동기화하는데 사용된다. let serialQueue = DispatchQueue(label: "serial.queue") concurrent queue (여러 개의 스레드) On our system, you achieve concurrency by creating threads. concurrent queue는 동시에 여러 가지 작업을 수행할 수 있다. 들어오는 대.. 더보기
class, struct 공통점 프로퍼티, 메소드를 갖는 컨테이너를 말한다. subscript 구문을 사용하여 값을 접근할 수 있는 subscript를 정의한다. 초기 값을 설정하는 초기화를 정의한다. extension을 사용할 수 있다. protocol을 채택할 수 있다. Class 상속을 할수 있다. deinit을 정의할 수 있다. arc가 다루며, 해지할 때 필요한 작업을 수행한다. deinit은 자동으로 호출되며 수동으로 호출할 수 없다. 서브 클래스에 deinit이 제공되지 않더라도 슈퍼 클래스의 deinit가 항상 호출 된다. 타입 캐스팅이 가능하다. (상위 또는 하위 클래스로 형변환) reference type이다. Value type 값 복사를 할 경우에 인스턴스를 복사하면 각 인스턴스는 유니크한 데이터를 갖는다... 더보기
Bridging Swift에서 구현한 기본 타입들(Int, String)을 NS로 변형하는 과정을 bridging이라고 표현한다. as를 사용해서 타입이 Error를 NSError로 변환 가능한지 궁금했다. catch let error as NSError In the meanwhile, developers who must handle an Objective-C exception can always do so by writing a stub in Objective-C to explicitly "bridge" the exception into an NSError out parameter. This isn't ideal, but it's acceptable. 구현할 때 Error NSError로 bridging이 .. 더보기