Let’Swift는 Swift 개발자들이 만나고, 배우고, 즐기는 컨퍼런스로 총 13개의 세션으로 이뤄졌습니다. Swift 개발자들이 모여 iOS의 넥스트 스텝을 이야기한 행사였습니다. 빠르게 발전하는 언어 Swift에 대한 뜨거운 열의를 엿볼 수 있었던 Let’Swift 행사 동영상을 공유합니다
Swift를 쓰면 쓸수록 애증이 느껴지신다고요? Swift 3에서는 폭넓은 방향의 개발 환경 변화가 예고돼 있습니다. Interface builder, Source editing, Sanitizers, View debugging, LLDB, Instrument 등 여러 개발 환경 변화에 대해 me2day, BAND, Line 앱 개발자, 허혁님이 쉽고 간결하게 설명해 주셨습니다. 곧 업데이트될 Swift 3 개발 환경 변화에 대비하고, Swift 활용에 도움이 될 팁들을 얻어보세요.
Interface Builder
- 새로운 Adaptive UI - 디바이스 타입별 렌더링
- Live preview 가능 - 디바이스 타입별: iPad Adaptation도 지원
- 수정하면서도 확대 축소 가능
Source Editing
- Xcode Source Editor Extension: 안전한 확장 환경 제공, Extension이 꺼져도 Xcode는 살아 있음
- 번들 로딩 금지: 알카트라즈 플러그인 등 몇몇 플러그인 활용 불가
-
새로워진 API 문서
-
오프라인 API 문서
-
API 문서 자동생성: Markdown 문서로 주석에 표시 가능
- SF Mono Font
- Code-signing, Provision: 관리 개선
- 현재 라인 하이라이트
- Color Literal: 자동 완성 지원
Color Literal #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
- Image Literal: 자동 완성 지원
UIImage(#imageLiteral(resourceName: "Screen Shot"))
Sanitizers
- 런타임 시 버그 추적
- Swift3 / C/C++/Objective-C
- 컴파일 시 버그 추적은?
- Clang Static Analyzer
- C/C++/Objective-C만 지원, Swift는 미지원
- Types
- AddressSanitizer - ASan
- ThreadSanitizer - TSan
- MemorySanitizer - MSan (LLVM)
- Memory Graph Debugging
- AddressSanitizer
- 디버깅 모드로 동작할 때 잠재적인 메모리 누수 탐색
- 메모리 어드레스 오염 이슈를 탐색
- Swift도 지원
- 설정: Scheme의 Diagnostics항목 > Enable Address Sanitizer
- 성능 저하: 2배 정도 속도 저하
- 검출 케이스
- 힙, 스팩, 글로벌 버퍼 오버 플로우
- 메모리 반환 후 사용
- return 후 사용
- 메모리 릭 (leak sanitizer가 합쳐짐)
- ThreadSanitizer
- 런타임 시 쓰레드에 의한 데이터 변경에 레이스 컨디션 발생 여부 확인
- 설정: Scheme의 Diagnostics항목 > Enable
- 지원범위: 64비트 macOS, iOS 시뮬레이터, tvOS 시뮬레이터 (watchOS와 Device는 아직 미지원)
- 테스트 돌릴 때 옵션 켜는 것 추천
- 성능 저하: 5~15배 정도 속도 저하, 메모리 사용량은 5~10배 증가
- 검출 케이스
- 초기화 되지 않은 뮤텍스 사용
- 엉뚱한 쓰레드가 언락
- 스레드 릭
- 시그널 핸들러에 안전하지 않은 함수 호출
- 데이터 레이스
데이터 레이스:
- 동기화 없이 여러 쓰레드가 한 주소를 접근할 때
- 그 중 하나는 읽기용 쓰레드
- 끝난다면 결국 쓰레기 값이나 메모리 오염으로 구조상 문제가 있다는 것
- 혹은 동기화 작업 누락
- Memory Graph Debugging
- 메모리 누수나 버려진 메모리 탐침
- 디버깅 모드에서 pause된 경우
- macOS, iOS 10, tvOS 10, watchOS 3 지원
- Sanitizer가 켜져 있으면 동작 안함, 꼭 끌 것!
- Scheme의 Diagnostics 탭에서 Malloc Stack설정
- All Allocation
- Live Allocation Only
- Memory Graph Debugging: 두가지 그래프 스타일
- Root Paths: 참조 메모리 - 얼마나 많은 메모리가 잡혀 있는지
- Cycles: 메모리 누수 - 누수가 어떻게 다른 누수와 연결되는지
- Memory Graph Debugging: 파일 저장
- .memgraph; Plist file
- 저장하기: File → Export Memory Graph
- 불러오기: Open the file (디버거 프로세스가 아니라서 트레이스, 퀵룩, po 안됨; 그래프 말고는 아무것도 안됨)
View Debugging
- 빨라지고 정확해짐
- 클래스로 바로가기
- 네비게이터에서 필터링
- 오토레이아웃 디버깅
- 유한 상태 머신 Quick Look
- GKStateMachine; GameplayKit를 써야 함
- 코드로는 알아보기 힘듦
- 복잡한 동작을 그래프로 직관적으로 정의 가능
- 상태별 개별 동작
- 상태간 전환
LLDB
- 스위프트 REPL도 LLDB
:<command> enables any LLDB command
- Xcode와 LLDB는 별도 프로세스로 분리
- LLDB는 죽어도 Xcode는 적당히 살아남
- 여러 버전의 디버거 지원: 디버거가 자동 선택됨, 예를 들면 Swift 3는 가장 최신 디버거, Swift 2.3는 Xcode 7.3.1-era 디버거
- 오픈소스 Swift도 매칭된 디버거를 사용
- parray
- poarray
- 자동 import
@import UIKit settings
show target.auto-import-clang- modules false
- Debugger Customization
- Reusable Code $
expr let a = 3; print(a)
expr $addTwoNumbers(a: 2, b: 3)
Instrument
- 디버깅 시 정보 표시 가독성 향상
- 시스템 트레이스
- 스레드, CPU, Point of Interest
- 타임 프로파일러
- 앱 라이프 사이클 이벤트에 따른 동작
- 메탈 시스템 트레이스
참고 자료
발표 슬라이드는 아래를 참고해주세요.
컨텐츠에 대하여
이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.