목록iOS (61)
iOS 개발 공부
프로세스 메모리 관리 기본적으로 프로세스의 메모리가 할당되면 영역은 4군데로 나뉜다. Code 우리가 작성한 소스 코드 저장되는 공간 컴파일 타임에 결정되고 중간에 코드가 변경되는 일이 없도록 Read-Only 형태로 저장된다 Data 전역변수와 static 변수들이 저장되는 공간 보통의 경우엔 프로그램 시작과 동시에 할당되며 프로그램이 종료되어야 해제된다 하지만 Swift에서의 static은 lazy이기 때문에 아마 접근 시 할당되고 앱이 종료시 해제 될 것이다. 실행 도중에 변수 값이 변경될 수 있기 때문에 Read-Write 형태로 저장된다. Stack 함수 호출 시 함수의 지역변수, 매개변수, 리턴값 등이 저장되는 공간. 컴파일 시점에 결정되고 함수가 종료되면 할당된 메모리도 해제 된다. 장점 C..
개인 프로젝트를 진행을 하다가 보니 메모리의 크기가 점점 늘어나서 앱이 죽어버리는 경우가 생겼다. 왜 메모리가 늘어나는지 메모리 그래프를 사용하여 확인해보니 ViewModel이 없어지지 않고 Cell과 순환참조를 하고 있었다. 로직에서 왜 문제인지 찾지 못해 한줄한줄 디버깅 해보니 cell에서 viewModel에 bind할 때가 문제였다. bind한 stream이 없어지지 않고 계속해서 살아있어서 cell과 viewModel이 사라지지 않고 있었던 것이다. 그래서 알게된 것은 tableViewCell이나 collectionViewCell에서 rxSwift나 combine을 사용하여 bind할 경우 주의해야 한다는 것이다. iOS에서는 효율적인 메모리관리를 위해 cell을 Reuse하는데 이때 bind해준..
NaverMap SDK SPM 왜 지원안해줌 ?프로젝트에서 mapKit대신 navermap을 사용하기로 결정하였는데 Tuist를 사용하여 프로젝트를모둘화를 하게되어 cocoapods를 사용하지 못하게 되었다그런데 naverMap SDK는 cocoapods으로만 의존성을 추가할 수 있게 되어있었다 ,,,, https://github.com/navermaps/ios-map-sdk GitHub - navermaps/ios-map-sdk: 네이버 지도 iOS SDK 데모 앱네이버 지도 iOS SDK 데모 앱. Contribute to navermaps/ios-map-sdk development by creating an account on GitHub.github.com 아무리 찾아보아도 NaverMap SD..
Swift Package 만들기1. 프로젝트 생성Xcode > File > New > Package 를 선택하여 Swift Package 프로젝트를 만들자 Library를 선택하여 생성하면 아래와 같이 프로젝트가 생성된다. 2. 프로젝트 구조Package 파일과 Sources폴더 Tests 폴더로 나뉘게 된다 3. Packagepackage파일은 패키지 이름, 외부 의존성과 같은 package에 대한 정보를 가지고 있다.import PackageDescriptionlet package = Package( name: "MyLibrary", products: [ .library( name: "MyLibrary", targets: ["MyLibr..
오늘 알아볼것은 옵셔널 타입입니다. 옵셔널(Optional)이란? 래핑된 값이나 값이 없다는것을 알려주는 타입이라고 나와있습니다. 이게 무슨 쓸모가 있나라는 생각을 하실수도 있는데요왜 옵셔널이 생기게 되었는지 알아가봅시다 옵셔널의 탄생배경 프로그램이 실행될때 운영체제가우리가 작성한 코드를 바탕으로 메모리에 공간을 할당합니다. var x: Int = 1var y: Intprint(x)print(y) 위와같은 코드가 포함된 프로그램을 실행한다면y에 대한값에 접근할때 에러가 발생하여프로그램이 죽게됩니다. 왜냐하면 y에 값이 없기 때문이죠. 이와같은 상황은 언어에 상관없이 공통적으로 발생하는 문제입니다. 프로그램이 작을때는 발견이쉬워서 수정이 가능하지만 프로그램이 점점 거대해져코드가 점점 많아진다면 프로그..
오늘 알아볼것은 제네릭(Generics) 문법이다. 제네릭(Generics)이란 ? 공식문서를 보면 다양한 타입에 실행되는 코드를 작성하고 해당 유형의 요구사항을 지정한다고 나와있다. 왜 제네릭 문법이 필요한지 알아보자. 제네릭의 필요성 Int타입의 배열을 출력해주는 함수가 있다. 해당함수는 Int 타입의 배열을 출력가능하지만String 타입의 배열을 출력이 불가하다 String 배열을 출력하기 위해선 매개변수의 타입을 String타입으로 변경한 함수가 필요하다. 하지만 다른 타입의 변수가 생긴다면 또 다시해당 타입에 맞는 함수를 다시 작성해주어야 한다 이때 드는 생각은타입만 다르고 구현내용은 완전히 동일한데굳이 코드를 반복할 필요가 있을까타입을 매개변수로 받아서 타입만 변경하면 되지 않을까..
연관값(Associated Value) 열거형의 원시값의 단점은모든 case가 동일한 타입의 원시값을 가져야 하고case 별로 미리 지정된 하나의 값만을 가질 수 있다는 것입니다. 이게 왜 단점이라고 생각하시는 분들을 위해 애플제품으로 예시를 보여드리겠습니다. enum AppleProduct: String { case iPad = "Pro, 256GB" case iPhone = "Pro, 128GB" case mac = "Pro, 512GB"} 애플 제품들은 수많은 라인업이 있습니다.하지만 원시값으로 String을 채택하고 있기 때문에 하나의 제품의 정보만 나열 할 수 있죠그럼 새로운 제품이 나올떄마다 case를 추가해야할까요 ?? enum AppleProduct: String { ..
원시값(Raw Value) 열거형은 원시값을 가질 수 있는데열거형을 선언할때 원시값으로 사용할 타입을 채택해주고각 case에 알맞은 원시값을 할당해주면 됩니다.case의 .rawValue를 통해 원시값을 사용할 수 있습니다. enum Weekday: String { case 월요일 = "월요일" case 화요일 = "화요일" case 수요일 = "수요일" case 목요일 = "목요일" case 금요일 = "금요일" case 토요일 = "토요일" case 일요일 = "일요일"}// 금요일Weekday.금요일// 원시값 "금요일"Weekday.금요일.rawValue// 둘은 다른 타입의 값이다. Swift에선 원시값과 관련하여 여러가지 편의성을 제공하는데원시값으로 사용할..
오늘 공부 해볼것은 열거형입니다.Enumeration 이라고 하는데 Swift에서 자주 쓰이는 문법입니다. 열거형이란 ? The Swift Programming Language에서 정의된 열거형입니다.좀 더 쉽게 설명하자면 타입 자체를 한정된 케이스로 정의 할 수 있는 타입입니다.열거형은 Swift에서 1급 객체로 취급됩니다. 열거형을 사용할 상황 ? 위의 정의만 읽어보면 언제 열거형을 써야할지 감이 잘 안잡힐 수도있습니다. 예를 들어 요일이라는 변수가 있다고 가정해본다면요일 변수에는 올 수 있는 값은 "월,화,수,목,금,토,일" 이 7가지 중 한가지 일것입니다. var 요일: String = "월, 화, 수, 목, 금, 토, 일" 중 한가지 현재 요일은 String 타입의 변수입니다.값을 입력받을때..