본문 바로가기

728x90

난 iOS개발자

(53)
NSCache 캐시? 사용한 자원을 재사용이 가능하게 특정 영역에 저장해 놓는것을 의미한다. 쉽게 볼 수 있는 캐시는 웹 이미지를 다운로드 한 후 캐시하는것이다. 캐시를 하게 되면 다시 다운로드하면서 데이터를 소모하지 않더라도 저장된 캐시이미지를 불러와 볼 수 있게 된다. 캐싱의 종류는 크게 둘로 나눈다. Memory Caching 과 Disk Caching 메모리 캐싱은 메모리 영역의 일부분을 캐싱에 사용하는것이다. 메모리는 애플리케이션이 종료되면 사용중이던 메모리 영역을 반환하게 되므로 앱 종료와 함께 캐싱된 정보도 사라지게 된다. 반면 디스크 캐시는 데이터를 파일 형태로 디스크 영역에 저장하는것으로 애플리케이션을 종료해도 저장한 정보가 사라지지 않는 장점이 있지만 애플리케이션의 전체 용량이 증가한다는 단점이 존재..
ARC(Auto Reference Counting) Swift는 Auto Reference Counting 으로 앱의 메모리를 관리한다. ARC는 참조유형인 클래스나 클로저에 적용되며 구조체나 열거형은 참조유형이 아니므로 추적하지 않는다. 클래스 인스턴스는 heap메모리 공간에 동적으로 할당한다. 이것을 관리하기 위해서는 heap영역에 참조형 자료들이 얼마나 참조되고 있는지 카운팅 하고 이에 따라 메모리를 할당 및 제거하면 된다. ARC는 인스턴스가 더 이상 필요하지 않을 때 클래스 인스턴스에서 사용하는 메모리를 자동으로 해제한다. 간단한 코드를 보며 ARC의 RefCount를 어떻게 관리하는지 이해해보자. class Person { let name: String init(name: String) { self.name = name print("\(name..
String을 Subscript로 접근할 수 없는 이유 Swift의 String은 구조체이며 Character의 모음이다. 즉 Character의 배열인 셈이다. Character는 결합 시 사람이 읽을 수 있는 단일 문자를 생성하는 하나 이상의 유니코드 스칼라 시쿼스이다. 일부 문자에는 2개의 유니코드가 필요할 수 있고, 어떤 이모티콘은 4개의 유니코드가 필요할 수도 있다. 결과적으로 문자는 저장할 가변크기의 메로리가 필요하므로 인덱싱이 어렵다. 문자가 4바이트와 같이 고정된 크기의 경우 문자열에서 문자의 위치 i를 찾으려면 문자열의 시작점에서 4 * i 옵셋을 추가하면 된다. 그러나 문자가 가변 크기의 경우 해당 문자열의 시작 또는 끝에서 유니코드 스칼라를 반복하여 문자열의 인덱스를 찾아야한다. 문자열을 인덱싱하기 위해서는 String.index 를 사용..
Class의 성능을 향상 시키는 방법 Method Disptach란 호출해야하는 메서드를 결정하는데 사용되는 알고리즘으로, 대표적으로 동적 디스패치와, 정적 디스패치가 있다. Class는 동적 디스패치(Dynamic Dispatch) 메커니즘을 따른다. 동적 디스패치는 일명 런타임 디스패치 라고도 하는데 호출해야할 메서드를 런타임중 판단하는 것이다. 이때 발생하는 오버헤드로 인해 정적 디스패치에 비해 상대적인 성능 손실이 발생하게 되는데 Method Dispatch를 살펴보면서 알아보자. 해당 포스팅과 관련된 내용은 WWDC2016 영상 에서 더욱 자세하게 알 수 있다. Static Dispatch 정적 디스패치는 컴파일 타임에 호출할 메서드를 결정짓게 한다. 컴파일러는 이때 실제로 어떤 구현이 실행될지 가시성을 가지기 때문에 코드를 최적화..
initialization -3 실패할 수 있는 초기화 프로그램 init키워드 뒤에 ? 를 붙여서 실패가능한 이니셜라이저를 정의할 수 있다. 마치 옵셔널처럼! init?() { } init?(name: String) { guard name.count > 2 else {return nil} } 초기화 프로그램은 값을 반환하지 않지만 실패가능한 이니셜라이저에서 초기화 실패가 트리거 될 수 있도록 nil을 반환 하도록 할 수 있다. 성공한다면 반환값을 두지 않도록 한다. 당연히 실패가능한 이니셜라이저와 지정이니셜라이저의 파라메터명이 똑같을수 없다. init(name: String) {} init?(name: String) {} //같은 형식으는 안돼 아래 사용예시를 보면 이해가 쉽다. let wholeNumber: Double = 12345..
initialization-2 클래스 상속 및 초기화 클래스의 모든 저장속성에는 초기화 중에 초기값이 할당 되어야 한다. 이 때 초기화 대상에는 클래스가 상속받는 상위클래스의 속성 또한 포함된다. Swift는 속성 초기화를 위해 두 가지 종류의 이니셜라이저를 정의하는데, 지정 이니셜라이저(designated initializer) 편의 이니셜라이저(convenience initializer) 로 알려져 있다. 지정 이니셜라이저는 클래스의 기본 이니셜라이저이다. 모든 속성을 초기화하고 적정한 수퍼클래스 이니셜라이저를 호출하여 초기화 프로세스를 진행한다. 초기화가 발생하고 수퍼클래스 초기화 체인까지 계속되는 “funnel”지점이다. 모든 클래스에는 지정이니셜라이저가 하나 이상 있어야 하며, 경우에 따라 수퍼클래스에서 이니셜라이저를 상속함..
자주 사용하는 코드 쉽게 저장하고 가져다 쓰기 [Code Snippet] 자주 사용하는 코드를 매번 작성하는건 귀찮은 일이다. 코딩을 하면서 자동완성을 밥먹듯 쓰는것 처럼 내가 작성한 코드를 쉽게쉽게 불러오는 방법이 없을까? ㅇ Code Snippet써라. 사용하던 구형 맥을 뒤로하고 새로 맥스튜디오를 구매했다. xcode를 설치하고 코드를 작성하고 있는데 이전 맥의 Xcode에서 쓰던 snippet이 맥스튜디오 Xcode에는 정의 되어 있지 않아서 생각난 김에 포스팅한다. Xcode는 CodeSnippet기능을 제공한다. 우리가 코드를 작성할 때 도와주는 자동완성기능이 그 중 하나 인데 만약 switch를 작성한다고 예시를 들어보자. 아래처럼 switch를 다 작성하기도 전에 코드의 아래로 switch와 관련된 코드를 추천해준다. 이중 중괄호{}로 되어 있는 항목이 Code..
initialization-1 초기화는 사용할 class, struct, enum 의 인스턴스를 준비하는 프로세스다. 초기화에는 해당 인스턴스의 각 Property의 초기값을 설정하거나, 인스턴스를 사용하기 전 필요한 설정, 초기화 를 수행하는 작업을 포함한다. Objective-C 와 달리 Swift의 초기화는 반환값이 없다. Objc의 초기화 -(id)init { self = [super init] return self } Swift의 초기화 init() { //인스턴스 초기화에 필요한 내용 } 위 코드는 Swift의 가장 단순한 형태의 초기화 코드다. 매개변수가 없는 메서드와 같으며 init키워드를 사용하여 작성한다. 저장속성의 초기값 설정 class / struct는 해당 인스턴스가 생성될 때까지 모든 저장속성에 대해 적절한 ..
Method( Instance Method, Type Method) 특정 유형과 연관된 함수(Function)를 메서드라 한다. :Class, Struct, Enum과 같은 유형과 연괸된 작업(기능)을 말한다. Method와 Function의 차이 흔히 말하는 함수와 메서드의 차이는 클래스 내부에 정의한 함수를 메서드라고 하며, 이런 메서드와 별개로 독립적인 기능을 함수라 한다. 또 메서드는 객체의 속성을 다루기 위한 행위를 정의한 것이라는 의미도 포함되어 있다. 메서드의 종류 인스턴스 메서드(Instance Method) 타입 메서드(Type Method) 1. Instance Method 인스턴스 메서드는 특정 클래스, 구조 또는 열거형의 인스턴스로 접근 할 수 있는 메서드를 말한다. 인스턴스 메서드는 인스턴스 속성에 엑세스하고 수정하는 방법을 제공하거나, 인스턴스 ..
백그라운드모드에서 위치정보 가져오기 (BackgroundModes + LocationUpdates) 이번 게시물은 최근 프로젝트를 진행하면서 접한 백그라운드 모드에 대해 간단히 경험을 기록한다. 많은 삽질이 있었으니 중간에 잘못된 정보가 보인다면 댓글로 지적해주세요. 시작 백그라운드에서 네트워크 정보가 변경되고 변경된 네트워크(WiFi)명이 내가 원하는 네트워크와 일치하는지 확인 하고 LocalNotification을 발생시키는 기능을 만들고 있었다. 모두 알다시피 앱이 백그라운드상태로 진입하게 되면 보통의 일반적인 기능들은 정지된다. 당장 타이머 하나를 생성해서 1초마다 log를 출력하도록 해보자. 로그를 확인했다면 백그라운드로 앱을 내려보자. 잘 나오던 로그가 멈춘것을 볼 수 있다. Wi-Fi 를 감지하는 것 또한 위와 별 다를게 없으니 어떻게해야 백그라운드에서 동작을 수행할 수 있을지가 맞닥들인 ..

728x90