Playground에서 Cocoapod 라이브러리 사용하기

엑스코드 플레이그라운드(Xcode Playground)에서 간단하게 코드를 테스트 해보고 싶은데 해당 코드가 특정 cocoapod 라이브러리에 의존성이 있는 경우 cocoapods-playgrounds 명령어 도구를 사용하면 편리하다. 설치 및 사용 방법 설치 sudo gem install cocoapods-playgrounds 플레이그라운드 프로젝트 생성 cocoapods playgrounds podName 위 명령어를 실행하면 위 라이브러리가 연결된 워크스페이스가 자동으로 생성되고, 해당 워크스페이스 안에 우리가 사용할 수 있는 playground 파일까지 포함되어있으니 여기서 마음껏 테스트 해보면 된다. 여러 라이브러리 동시 참조 여러개 라이브러리에 의존성을 가지는 플레이그라운드 프로젝트를 만들고 싶을 경우, 라이브러리 이름을 컴마로 구분하여 붙여 써 둔다. ...

2018년 11월 24일 · 1분 · 156단어

Swift struct vs. class 차이점 비교 분석

Swift에는 struct와 class타입이 공존하고있기 때문에 아래의 차이점을 잘 숙지하고 상황에 맞게 사용하는것이 매우 중요하다. struct call by value (할당 또는 파라메터 전달시 value copy가 일어남) stack memory 영역에 할당 (속도가 빠름) scope based lifetime: 컴파일타임에 compiler가 언제 메모리를 할당/해제할지 정확히 알고있음 data locality: CPU 캐시 히트율이 높음 상속 불가능 (protocol은 사용 가능) NSData로 serialize 불가능 Codable 프로토콜을 이용하여 손쉬운 JSON <-> struct 변환 가능 (Swift 4 이상) 항상 새로운 변수로 copy가 일어나기때문에 multi-thread 환경에서 공유변수로 인해 문제를 일으킬 확률이 적음 1 class call by reference (할당 또는 파라메터 전달시 객체를 가리키고있는 메모리 주소값만 복사됨) heap memory 영역에 할당 (속도가 느림) 런타임에 직접 alloc하며 reference counting을 통해 dealloc이 필요 memory fragmentation 등의 overhead가 존재 상속 가능 NSData serialize 가능 Codable 사용 불가능 런타임에 타입 캐스팅을 통해서 클래스 인스턴스에 따라 여러 동작이 가능 deinitializer 존재 참고: class안에 struct 변수를 property로 정의하는것 가능하며, 반대로 struct의 property중 하나로 class 인스턴스 변수를 갖고있는 것도 가능하다. 이 경우 해당 struct 변수의 copy가 일어날때 class 인스턴스의 주소값만 복사된다. ...

2018년 1월 30일 · 3분 · 549단어

Swift Closure vs. Objective-C Block 차이점 비교 분석

Obj-C의 블락(block)이나 Swift 클로저(closure)는 컨셉은 거의 동일하나 closure 내부에서 현재 scope에 존재하는 값 타입(value type) 변수들을 캡쳐(capture)해서 사용할 때 기본동작이 반대로 되어있기 때문에 사용법에 주의를 기울여야 한다. 반면 클래스 인스턴스와 같은 참조 타입(reference type) 변수들은 항상 reference copy가 일어나기 때문에 두 언어를 사용할때 차이점에 크게 신경쓰지않아도 된다. (대신 retain cycle이 생기지 않도록 조심해야 한다.) 다음 예제들을 통해서 차이점을 좀 더 자세히 알아보자. Capture in Swift closure Swift의 경우 일반적으로 value type 변수를 다른 변수에 할당하거나, 함수 파라메터로 전달 할 때 copy동작이 기본이다. 하지만 closure에서 변수를 capture를 할 때는 명시적인 capture list를 작성하지 않으면 value type 변수(struct 변수 포함) 임에도 불구하고 reference capture가 일어난다. 확인을 위해서 다음 예제를 살펴보자. ...

2018년 1월 30일 · 2분 · 305단어

Swift 익스텐션, Obj-C 카테고리 메서드명 Prefix하기

Obj-C category의 위험성 Obj-C에서 동일한 메서드 이름을 가진 카테고리(category) A, B가 동시에 존재하더라도, 컴파일 타임에 오류가 발생하지 않고 정상적으로 빌드되어 실행이 가능하다. 하지만 런타임에서 A와 B중 어떤 녀석이 먼저 호출될지 알 수 없기때문에 (규칙이 없으며 랜덤하게 호출됨) 매우 위험한 상황이 발생한다. 이를 방지하기 위해서 Obj-C에서 카테고리 메서드에는 프로젝트에서 사용하는 고유의 prefix를 붙여줘서 이름이 완전히 겹칠 확률을 최대한 줄여주는 방식을 꼭 사용해야 한다. 그렇지 않으면 외부 라이브러리를 사용할때 해당 라이브러리에 동일한 category명이 존재해서 랜덤하게 호출되는 상황이 발생 할 수 있다. 이는 매우 원인 파악도 힘든 에러가 될 것이기에 꼭 피해야 한다. ...

2017년 9월 23일 · 2분 · 381단어

유니버셜링크 vs. 커스텀URL스킴 비교 분석

iOS의 경우 기본적으로 Sandbox환경이라 다른 앱들간에 정보를 주고받는것이 간단하지 않다. 이때 정보를 주고받을 수 있는 대표적인 방법이 custom URL scheme이다. 앱의 고유한 scheme을 정의하고 이 scheme으로 시작하는 URL안에 정보를 담아서 URL을 열게되면 해당 scheme이 갖는 다른 앱을 실행하면서 정보전달을 할 수 있다. 하지만 이 방법에는 치명적인 단점이 있는데, 애플 앱스토어에서 해당 앱이 정의한 scheme의 uniqueness를 보장해주지 않기때문에 다른 앱들이 자신이 정의한 scheme을 사용하고 있을 수 있다는 점이다. 자신의 앱을 MyApp이라고 하고 이 앱이 myapp:// 이라는 custom URL scheme을 사용한다고 가정하자. (MyApp안의 info.plist 내에 존재하는 “URL types – URL Schemes” 항목에 myapp 이 정의하면 됨) 방금 정의한 custom schememyapp은 unique가 보장되지 않기 때문에 앱스토어에 올라온 YourApp 이라는 엉뚱한 앱이 동일하게 앱 내부에 custom scheme으로 myapp을 정의하는 일이 발생할 수 있다. 만약 MyApp과 YourApp이 동시에 설치되어 있는 device에서 myapp://으로 시작하는 URL을 open하게 되면 두 앱 중에서 누가 열릴지 알 수 없게 되어버린다. 설치 순서에 영향을 받는 것도 아니라서 특정한 규칙이 없으며, 상황에따라 두 앱중 하나가 열리게 되는 랜덤한 현상이 발생한다. ...

2017년 8월 21일 · 3분 · 427단어

Bluetooth Connection을 사용하는 멀티플랫폼 앱 개발기

블루투스 연결을 사용하는 멀티플랫폼(Mac, Window, Android, Windows Store app) 앱 개발을 하면서 겪은 경험과 노하우들을 정리해 보았다. 아직 완전히 개발이 끝나지 않았기때문에 포스트 내용에도 부족한 점들이 많이 있지만, 일단은 먼저 경험을 공유하는 것이 중요한 것같아서 포스팅을 해둔다. Bluetooth 연결 기본 블루투스는 디바이스를 어떻게 찾는가? 블루투스 디바이스는 자신이 제공할 수있는 서비스를 무선 네트워크상에 publish해서 다른 디바이스들이 검색할 수 있도록 하는데, 이때 사용되는 것이 Service Discovery Protocol(SDP) 이다. 예를들어 블루투스 키보드는 자신이 HID 서비스(입력장치)가 가능하다고 무선네트워크상에 계속 신호를 보내고있는 상태인 것이고, 컴퓨터에서 주변 블루투스 장치를 검색할때 이 신호를 인식하여 “블루투스 키보드 장치가 있다”는 사실을 알게되는것이다. 이때 이러한 서비스들을 유니크하게 구분하기위해 UUID를 사용하게된다. UUID의 기존에 이미 정의된 것들을 사용할 수 있으며, 새롭게 임의로 UUID를 생성해서 사용하는것도 가능하다. ...

2015년 3월 15일 · 8분 · 1502단어

Cocoapod version update for Mac OS Yosemite

 Mac OS X Yosemite 로 업그레이드를 하게되면 cocoaPod이 잘 작동하지 않을것이다. 이때 다음 인스트럭션을 따라 해결해 나가면 된다. 코코아팟 최신버전으로 업데이트 (현재 최신은 0.34.4 입니다) sudo gem uninstall cocoapods sudo gem uninstall xcodeproj sudo gem install xcodeproj sudo gem install cocoapods 2. Podfile의 첫줄에 다음 코드 추가 source 'https://github.com/CocoaPods/Specs.git' 이부분은 옵셔널하긴한데, 추가하지 않으면 deprecated warning이 뜨기때문에 추가해주는것이 좋다. 3. 빌드시 Podfile.lock 혹은 Manifest.lock 관련 에러가 날 경우 처리방법 ...

2014년 10월 27일 · 1분 · 97단어

코코아팟(CocoaPods) 젠킨스(Jenkins) 설정 연동

 코코아팟(CocoaPods)을 사용하게 될경우 프로젝트(.xcproject)기반에서 워크스페이스(.xcworkspace) 기반으로 변경된다. 이때 젠킨스(Jenkins)에서 기존 프로젝트 기반 설정을 그대로 사용할경우 기본 프로젝트는 잘 컴파일되지만, 연결된 Pods 프로젝트가 업데이트 및 컴파일이 되지 않아서 -lPods 링크 에러(link error)가 나는데. 이때 Jenkins에서 CocoaPods을 잘 인식할 수 있게 할 수 있는 설정방법을 공유하고자 한다. 설정 방법 기존에 프로젝트 기반으로 빌드설정이 되어있던 젠킨스 빌드설정 페이지를 열고, Build 섹션에서 “Add build step” 버튼을 눌러서 Execute shell 항목을 추가 후 pod install 명령어 입력 ...

2014년 7월 23일 · 1분 · 125단어

allocWithZone: 의 의미

어떤 클래스에 대해 NSCopying 프로토콜을 구현하다보면 allocWithZone: 이라는 메서드에 맞닥뜨리게된다. 객체의 경우 힙(heap)에 할당되는데, 이 힙을 zone으로 나누고 해당 zone별로 메모리를 할당 및 관리하여 메모리 파편화를 막는데 도움을 주기위해 존재하는 메서드이다. 하지만 최근 런타임관련 알고리즘이 많이 효율적으로 변경되어서 굳이 zone을 사용하지 않아도되며, ARC로 바뀌면서 아예 zone을 사용하지 말라고 다음과같이 설명하고있다.1. You cannot use memory zones. There is no need to use NSZone any more—they are ignored by the modern Objective-C runtime anyway. ...

2014년 7월 15일 · 1분 · 77단어

오토레이아웃 IB(Interface Builder)에서 다루기

제약조건(constraint) 설정 하나의 뷰를 선택 – 해당 뷰와 슈퍼뷰와의 관계 설정가능, 선택된 뷰 자체의 제약사항 설정가능 두개 이상의 뷰를 선택: 선택된 뷰들간의 관계 설정가능, 선택된 뷰들의 공통제약사항 설정가능(ex: equal width) IB왼쪽의 ViewTree화면이나 IB 화면에서 에서 하나의 뷰를 선택 후 컨트롤 키를 누르고 드래그하여 다른 아이템을 선택하면 두 아이템 관계를 설정 가능. IB에서 최상위 view를 선택한 후, 오른쪽 속성창에서 orientation, top bar, bottom bar 유무 등 옵션을 조정하여 실제보이는 형태를 실행하지 않고 시뮬레이트 가능. ...

2014년 7월 15일 · 1분 · 164단어