목록분류 전체보기 (65)
develop
반복적으로 메모리를 많이 차지하는 로직을 사용할때 메모리가 해제되지 않고 앱이 죽어버리는 경우가 있다. 메모리를 해제할 시간을 주지않고 계속 메모리를 사용을 해서 생기는 문제이다. 이런 경우에 autoreleasepool을 사용하게 되면 특정 로직을 실행하기 전에 임시오토릴리즈풀이 만들어지고 블럭을 빠져나간 뒤에 임시오토릴리즈풀은 비워지게 되면서 메모리 사용량이 다시 줄어들게 된다. 오토릴리즈풀 블럭 안에서는 return이 되지 않는다. break 는 컴파일에러가 난다. autoreleasepool 함수 안에서 리턴값으로 Result를 받는다. autoreleasepool 함수는 Result를 리턴해준다.
ARC 프로퍼티, 상수, 변수등을 참조하면 레퍼런스가 카운트가 올라가고 참조가 끝나면 레퍼런스 카운터가 내려가고 레퍼런스 카운터가 0이되면 메모리에서 해제한다. 자동 레퍼런트 카운터는 더 이상 사용되지 않는 시점을 결정하여 메모리를 해제한다. 그리고 ARC는 compile time에 코드 분석을 통해 적절한 위치에 retain, release 등의 코드를 삽입해 주고 삽입된 코드는 run time에 실행이 된다 옛날 MRC는 개발자가 직접 리테인과 릴리즈를 해줘야 했고 retain, release를 통해 referenceCount를 증감시키다가 count 가 0이 되면 deinit 을 통해 해제를 하였다. 이러한 작업을 ARC는 자동으로 해준다. 순환참조 메모리가 제대로 해지되지 않는 경우가 있고 순환참..
뷰에 label이 가로로 2개 있다고 가정하고 label의 텍스트가 고정되지 않고 leftLabel은 좌측, 상단에 오토레이아웃이 잡혀있고 rightLabel은 우측, 상단에 오토레이아웃이 잡혀있고 leftLabel의 좌측과 rightLabel의 우측에 오토레이아웃이 연결되어 있다고 가정했을때 let leftLabel = UILabel() leftLabel.translatesAutoresizingMaskIntoConstraints = false view.addSubview(leftLabel) leftLabel.text = "left label" let rightLabel = UILabel() rightLabel.translatesAutoresizingMaskIntoConstraints = false vi..
frame과 bounds의 차이는 1. frame은 x, y가 super 뷰 기준의 좌표계로 설정되고 bounds는 x, y좌표가 자기 자신 기준의 좌표계로 설정된다. let testView = UIView(frame: CGRect(x: 0, y: 100, width: 80, height: 80)) testView.backgroundColor = .blue view.addSubview(testView) print("frame: \(testView.frame)") print("bounds: \(testView.bounds)") frame: (0.0, 100.0, 80.0, 80.0) bounds: (0.0, 0.0, 80.0, 80.0) 2. frame을 변경하게 되면 자기 자신의 좌표가 이동된다. bou..
https://developer.apple.com/documentation/swift/hashable Apple Developer Documentation developer.apple.com 정수 해시 값을 생성하기 위해 Hasher로 해시 할 수있는 유형 Hashable과 Hasher는 아래와 같이 생겼다. Hash를 어떻게 사용하냐면 Dictionary나 Set의 Key값을 사용할때 Hashble을 준수하는 타입만 사용할 수 있다. 기본타입인 String, Int, enum(associated value 없는 enum은 Hashable 을 자동으로 준수) 등은 해시가 가능한 타입이라 Dictionary나 Set의 Key값에 사용할수 있다. 예를 들어 Dictionary의 Key값으로 class를 넣는..
==(Equivalence Operators 같음 비교 연산자) 는 일반적으로 값을 비교한다. https://developer.apple.com/documentation/swift/equatable/1539854 Apple Developer Documentation developer.apple.com let first: Int = 1 let second: Int = 2 print(first == second) class에서 ==을 하려면 Equatable을 채택하여야 한다. class에서 기본적으로 NSObject를 자주 상속받는데 NSObject는 Equatable을 채택하고 있다. ===(Identity Operators 식별연산자) 는 값을 비교하는게 아니라 참조값을 비교를 한다. https://d..
2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기(포트, IP허용) 2021.06.03 - [ETC] - 외부에서 token으로 젠킨스 빌드하기 외부에서 token으로 젠킨스 빌드하기 2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기 https://www.jenkins.io/download/ Jenki.. pikachu987.tistory.com 2021.06.03 - [ETC] - 외부에서 token으로 젠킨스 빌드하기 외부에서 token으로 젠킨스 빌드하기 2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기(포트, IP허용) 2021.06.03 - [ETC] ..
2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기(포트, IP허용) 2021.06.03 - [ETC] - 외부에서 token으로 젠킨스 빌드하기 외부에서 token으로 젠킨스 빌드하기 2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기 https://www.jenkins.io/download/ Jenki.. pikachu987.tistory.com 2021.06.04 - [ETC] - 시리(siri)로 젠킨스 빌드하기 시리(siri)로 젠킨스 빌드하기 2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기 https://www.jenkins.io/download/ Je..
2021.06.03 - [ETC] - 외부에서 token으로 젠킨스 빌드하기 외부에서 token으로 젠킨스 빌드하기 2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기 https://www.jenkins.io/download/ Jenkins download and deployment Jenkins – an open source automation server which enables develo.. pikachu987.tistory.com 2021.06.04 - [ETC] - 시리(siri)로 젠킨스 빌드하기 시리(siri)로 젠킨스 빌드하기 2021.06.02 - [ETC] - 맥에서 Jenkins 설정하기 맥에서 Jenkins 설정하기 https://ww..
기존 CocoaPods으로 만들어진 라이브러리에 SPM(Swift Package Manager)을 추가해본다. Package.swift파일을 추가해야 하는데 Package.swift파일은 // swift-tools-version:5.1 import PackageDescription let package = Package( name: "NotificationView", platforms: [.iOS(.v8)], products: [ .library(name: "NotificationView", targets: ["NotificationView"]), ], targets: [ .target( name: "NotificationView", dependencies: [], path: "NotificationVi..
File - New - Swift Package...를 누른다. 그럼 아래 화면이 나온다. 그리고 라이브러리 명을 입력을 하고 Create를 누른다. 간단하게 SPM 라이브러리가 만들어졌다. Swift파일에 간단하게 소스를 만들어본다. 그리고 git에 프로젝트를 push하고 release를 한다. release를 하지 않으면 다른 프로젝트에서 SPM을 사용할 수 없다. 2021.04.11 - [Library] - Using SPM(Swift Package Manager) 사용하기 Using SPM(Swift Package Manager) 사용하기 File - Swift Packages - Add Package Dependency... 를 선택하면 아래화면이 나온다. SPM을 지원하는 Repository ..
File - Swift Packages - Add Package Dependency... 를 선택하면 아래화면이 나온다. SPM을 지원하는 Repository 주소를 적고 Next를 누른다. 버전을 선택할 수 있고, 브랜치명, 커밋을 선택할수 있다. 버전 룰은 Up to Next Major: 지정된 최소버전에서 다음 버전 범위까지 (1.0.0 이전까지) Up to Next Minor: 지정된 최소버전에서 다음 버전 범위까지 (0.4.0 이전까지) Range: 최소, 최대 버전 지정 Exact: 버전 하나만 지정 Next를 누르면 라이브러리를 다운받고 추가하는 작업이 Slider로 표현이 된다. 그리고 Test 타겟에 추가할지를 물어보고 Finish를 누른다. 그러면 라이브러리가 정상적으로 추가가 된다. ..
이전글에서 git clone이나 cocoapods을 하였다. 2021.04.04 - [ETC] - iOS shell파일로 앱스토어(appstoreconnect) 에 업로드 iOS shell파일로 앱스토어(appstoreconnect) 에 업로드 개인앱을 하나씩 앱스토어에 업로드를 하다가 앱이 5 + α 개 이상으로 늘어나니까 개인 앱이라 공통 라이브러리 or 공통 코드를 수정하면 전체 앱을 한번씩 배포를 해주다 보니 한번에 업로드 하 pikachu987.tistory.com 이제 AWS S3에 OTA(Over-the-air) 배포를 하겠다. infoPlistPath="" bundleVersion="$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionStri..
개인앱을 하나씩 앱스토어에 업로드를 하다가 앱이 5 + α 개 이상으로 늘어나니까 개인 앱이라 공통 라이브러리 or 공통 코드를 수정하면 전체 앱을 한번씩 배포를 해주다 보니 한번에 업로드 하기가 너무 시간이 걸리고 귀찮았다. 어떻게 하면 알아서 앱스토어 업로드까지 나가면서 나는 다른 일을 할 수 있을까 생각하다가 fastlane 처럼 터미널에서 업로드를 해야겠다고 생각하였고 sh 파일을 만들었다. username=""; password=""; gitPath="https://$username:$password@github.com/$username"; distributeBranch="distribute"; exportOptionsPath="ExportOptions.plist"; storagePath="io..