WWDC 2017 & Fall

Developer tools

Posted by Den on December 06, 2017 · 16 mins read

🔍 What’s New in Swift

  • fileprivate → private 으로 변경
  • fun shakeEm(controls: [UIControl & Shakeable]) 처럼 Subtype existential 가능. ObjC의 NSView<NSTextInputClient> 와 같은 기능.
  • Smooth 한 version up 을 원하기 때문에 3 → 4로 간다고 문제가 많이 발생하진 않을 것. (Target 별로 Swift version 선택 가능.)
  • Project Settings → Build System → New Build System (Preview) 선택. Precompliled Header가 매번 Indexing 하지 않게 해줄 것.
  • Coverage Test 할 때도 다시 Build 할 필요 없음. (Build 할 때 알아서 챙겨줌.)
  • Unknown Type일 경우 성능 떨어짐. (Heap에 alloc 되기 때문) 
    WWDC 2016 Understanding Swift Performance 참고. COW (copy-on-write) reference-counted existential buffers 사용해서 성능 향상 했으나, 근본적으로 Heap alloc 되지 않게 주의해!
  • 안쓰는 code는 compile 할 때 자동 삭제됨. @objc 도 필요한 곳만 붙음. (이 때문에 error, warning 뜰 수 있음. Compile, RunTime warning 잘 확인해서 해결해)
  • Symbol Size가 줄어서 App Size도 줄었음. Strip Swift Symbols를 Yes로 변경. Archive 할 때도 Option이 있음.
  • 기존에는 “\u{E9}” 와 “\u{65}\u{301}”이 표기법은 동일해도 완전히 다른 문자로 인식되었으나, 동일한 문자로 되도록 변경. (Length도 1로 동일). 속도도 빨라짐
  • Characters.count → .count 로 변경.
  • string[i..<string.endIndex] → string[i…] 으로 가능 👍
  • String을 Collection처럼 사용가능해서 Extension 이용해서 custom filter를 만들 수 있음. 👍
  • Performance 때문에 .split(separator: )가 SubString이라는 Type으로 나옴. subString할 경우, reference count가 +1 되기 때문에 dealloc이 쉽지 않다. 특히 문장이 길다면 더더욱 큰 문제.(나는 한 단어만 필요한데 전체 문장을 계속 Memory에 가지고 있음.)
  • “”” 을 통해서 multiline text 사용하기 편해짐.👍
  • Iterator을 간편하게 extension할 수 있도록 기능 제공.
  • RangeExpression 을 통한 subscript 가 정말 좋아 보임. (Calendar 개발 할 때, 이렇게 했음 더 좋았을 듯.)
  • Ownership을 통한 Memory 관리 Tip 설명.
  • Exclusive Access to Memory → Full Enforcement (Run-time Checks in Debug Builds Only). (메뉴 설정)

🔍 What’s New in LLVM

  • ObjC용 Compiler Warning 강화
  • if (@available(iOS 11, *)) 사용. C, C++ 에서도 사용가능
  • NSNumber, CFNumberRef, dispatch_once(), copy & NSMutable 관련 Analytics에 기능 추가
  • Analyze During ‘Build’ Option
  • Block Capture of Autoreleasing ( Block에 대한 Parameter 확인 추가 )
  • Strict Prototypes (For C++)
  • 이름 한번에 변경 기능이 C++에서도 가능함.
  • 그 외 C++ 관련 기능 추가

🔍 Localizaing Contentt for Swift Playgrounds

  • Design 단계부터 Localization 을 고려하라. 나중에 적용하기 힘들다.
  • Informal, Formal 중에 각 언어별 상황에 맞게 사용하라
  • Part 별 Localization 방법 설명 (Live view, Prose, Editable code placeholder, Page title, Glossary term, Hint)

🔍 Localizaing with Xcode9

  • Strings Management 
    (NSLocalizedString, localizedStringWithFormat, Analyzer 설정 Build Settings → Missing Localizability, Missing Localization Context Comment)
  • Formatters 
    (dateFormat = “YYYY.MM” 사용하지 말고 .full 같은 형식으로 사용하라. 언어에 따라 자동으로 순서 바꿔주기 때문)
  • Localization Process
    - XLIFF 형식으로 Export, Import 가능 
    - Stringdict 이용한 Plurlas (1 night, 2nights를 하나의 Localized Dict으로 표현 가능. variantFittingPresentationWidth를 이용한 해상도별 문구 변경 기능) 👍

🔍 App Startup Time: Past, Present, and Future

  • Initializer Calls 를 통한 LunchTime 분석 👍
  • dyld3.0에서는 Cache를 이용하여 Lunch time을 빠르게 함.
  • Swift는 memory 사용량도 적고 NO Initializer 라서 빠름
    (C++ dynamic link 조심.)
  • 그외 C++ 에서 dyld3 사용할 때 문제점 및 해결책 Tips

⭐️ Auto Layout Techniques in InterfaceBuilder

  • Changing layout at runtime 
    (constraints Active / DeActive 를 변경하면서 조정)
  • Tracking touch 
    (View는 Frame, Transform 값으로 그려진다. Transform을 이용한 Demo 👍👍👍👍👍)
  • Dynamic type 
    (Storyboard에서 Automatically Adjust Font, Accessibility Inspector 에서 Simulator Font Test 가능, Dynamic font constraint 용이 따로 존재)
  • Safe areas 
    (Storyboard에서 Use Safe Area Layout Guides 사용. Constraints automatically updgrade)
  • Proportional positioning (Spacer View를 통한 Hidden)
  • Stack view adaptive layout 
    (Hidden property by size class in Xcode9 기능 강추👍. StackView와 조합이 좋음. Demo 참고)

🔍 Debugging with Xcode 9

  • Wireless development 
    (Devices → Connect via network, 끊어져도 다시 attach 해서 연결 가능. IP 직업 연결 가능, Apple TV는 선연결 과정없이 바로 연결 가능[비번 쳐서])
  • Breakpoint workflow enhancements 
    (break condition에 auto complete 적용 됨. condition 적용된 아이콘은 흰색 삼각형 표시. BreakPoint 창에서 filter 검색 기능 추가됨.)
  • View controller debugging 
    (view Debugging에서 ViewController로 나뉘어 보임. 좀 더 보기 편해짐.)
  • SpriteKit debugging (View Debugging 가능해짐)
  • SceneKit debugging (View Debugging 가능해짐)

🔍 Understanding Undefined Behavior

  • What is undefined behavior (Dangling pointer, Buffer overflow, Value lifecycle 에 의해서 발생하는 문제들)
  • C, C++ Code 작업할 때 Tool 이용해서 확인 (Static Analyzer, Address Sanitizer 이용)
  • Swift 사용하면 위와 같은 문제 방지.
  • UnWrap 100% 확실한 경우에만 사용. (return type 이 nil이면 nil을 반환한다는 건데 강제로 unwrap 하지 말아라.)

⭐️ Finding Bugs Using Xcode Runtime Tools

  • Main Thread Checker 
    (Main Thread에서 실행시켜야 하는데 그러지 않은 것들 확인) 👍
  • Address Sanitizer 
    (Detect use of stack after return ON 하면 dangling pointer 알림. Swift 경우에 UnsafePointer를 사용하지 말아라 ) 👍
  • Thread Sanitizer
    (Race on Collection에서 👍, Multi Thread에서 서로 access 할 때, 문제점 알림. 이런 문제는 Access Thread 하나 만들어서 해결하라)
  • Undefined Behavior Sanitizer (대표 기능 3가지, 그외 많이 있음.)
    - Integer Overflow (Int * 에서 overflow는 runtimed에서 crash나도 찾기 힘든데 잡아줌
     
    - Alignment Violation (int, char 마다 4byte, 8byte block이 있는데 runtime에서 넘어가는 경우가 발생해 crash, 이런 문제를 잡아줌. __attributed__() 사용하거나 malloc 사용하라 )
     
    - Nonnull Return Value Violation (ObjC code를 Swift 에서 사용할 때, type은 nonnull이나 실제로 Null 이 return 되는 경우가 있음. 이런 경우를 방지. 개인적으로 Swift로 Porting 할 때 자주 발생함.)
  • Using Runtime Tools Effectively 
    (기본으로 On 해놓고 항상 작업하라. 여러개 On 해놓고 작업하라)

🔍 Engineering for Testability

  • Testable app code 
    (Testable 하게 code 짜라. Protocol 등등 이용. 그런데 효율적이지 못해보임.)
  • Scalable test code 
    (UI Test 할때 short cut 있으면 testCode 만들기 쉬움. func으로 묶으면 UI Flow test 하기 쉬움.)

🔍 GitHub and the New Source Control Workflows in Xcode 9

  • GitHub에서 공식적으로 Xcode 지원 (Ex. Open In Xcode)
  • Demo ( Git Flow 전반적인 설명. 하지만 branch 를 시각적으로 확인 할 수 없어서 아쉬움)

🔍 What’s New in Signing for Xcode and Xcode Server

  • Fundamentals 
    (Xcode server에서 Manual, Auto signing 가능해짐. 따라서 자동 배포 개선)
  • Development signing with Xcode Server 
    (Manual, Auto Signing 가능, Team signing 가능, two-factor authentication 가능, Command line support 가능, Demo 확인 )
  • Manual signing improvements 
    (provisioning 없으면 편리성을 위해 자동으로 Download popUp, CODE_SIGN_IDENTITY 라는 새로운 option이 생김)
  • Distributing your app 
    (IPA export관련 기능들이 개선, Archive 만들고 Export 하는데 plist를 정보를 가지고 Xcode server에서 Load에서 사용 가능)
  • Distribution signing with Xcode Server 
    (Manual 관련 창에서 Provisioning 들 선택해서 배포. 자동은 이 과정 생략)

🔍 Teaching with Swift Playground

  • 2차 방적식, log 등 수학 배울 때 이게 어디에 쓰이는 지 알 수도 없는데 도대체 왜 배우는지 학생들은 모름. 그런데 결국 나중에 Puzzle 풀거나 할 때 사용됨. 논리적인 사고에 도움이 됨.
    그림 배울 때 빨리 그림을 배우고 싶지 페인트 속성들을 왜 공부하는지 학생들은 모름.
    음악 배울 때 오선표, 음표를 배우기 보다 빨리 연주하고 싶고 작곡하고 싶은 마음이 더 큼.
    Algorithm, data structure 중요하나 흥미 유발이 가장 먼저
    결국, 동기 부여가 가장 중요하다. 동기 부여는 어려운 문제를 포기하지 않고 끝가지 풀게 해준다.
  • 동기 부여하기 위해서는 복잡한 것 보다 fun 을 추구해야 한다. 복잡한 coding logic 이런거 발고 단순히 게임을 통해 퍼즐 풀도록 하면 도움 됨.
  • Story 만들기 전에 prototype을 만들고 feedBack 받아라 (연습장에 연습해 봐라.)
  • Play ground 만들 때 beginner. 와 advanced 용 따로 구분하라
  • 초보자는 용어를 잘 모르니 설명해 줘라.

🔍 What’s New in Swift Playgrounds

  • Manifest Files (chapter, level 등 metadata 저장 가능)
  • iOS 11 SDK 가능 (ARKit., CorrML, IOSurface, PDFKit, Vision)
  • Copying Code Between Page 
    (plist 에 정보 추가 필요. 사용자가 Code copy 가능)
  • Controlling Speed in Playgrounds 
    (Debug 개념을 비디오 재생 하듯이 쉽게 풀어낸 듯, 천천히, 빨리 감기 가능)
  • Async 사용할 때 주의 (예제 참고)
  • plist 통해서 Execution Speed 조절 가능.
  • Minium target 설정 가능(Swift, iOS version)
  • Resource folder (Public, Private 가능)
  • fatalError 가능
  • 사용자가 Code 수정 가능 (추가, 삭제, 순서 변경 ) 👍 실제 MarkUp code는 앞 뒤로 Tag를 달아 구분.
  • Localization 
    (ManifestPlist.strings , Prose.string, EditableFields.strings, QuickHelp.strings. 여러 형태 지원)
  • Bluetooth 가능 
    (PlaygroundBluetoothCentralManagerDelegate 를 통해서 구현)

🔍 What’s New in Testing

  • Enhancements 
    (statusItem, waitForExistentce(), Test scheme → Localization 설정, Perference → Xcode Server )
  • Async testing 
    (Opening documents, Work on background threads, Communicating with services and extensions, Network activity, Animations, UI test conditions)
    - waitForExpectations(timeout: 10)
    - wait(for: ,documentExpectation timeout: 10)]
    - XCTWaiter(delegate: self).wait(for: [documentExpectation], timeout: 10)
  • Multi-app testing 
    (Launch, Terminate, Queries, AppGroup 사용하는 경우 동시 test 가능)
  • UI Testing performance 
    (Remote queries, Query analysis, Eliminate Snapshots )
  • Activities, attachments. and screenshots 
    (Test 단위를 block으로 감싸 관리하기 쉬움, Screen shot 기능 추가)

🔍 Metal2 on A11 — Imageblocks

  • Texture → Imageblock으로 옮길 때, pixel 하나하나 옮겼는데 지금은 통으로 옮김. (훨씬 빨라짐)
  • Implicit Imageblocks 
    - A7-A10 (64bps) → 32 bps (size 감소)
  • Fragment, FragmentLayes, FragmentOut, 설명 (Sample code 참고)
  • New Packed Data Types (Spec 자료 참고)

🔍 Metal 2 on A11 — Imageblock Sample Converage Control

Multisamplling Antialiasing
  • Enhanced MSAA on A11 (좀 더 상세히 pixel control 가능)
  • Color Tracking Example (Blend, Opaque 일 때 blend 처리 과정 설명)
  • Sample Code — Surface Aggregation (Sample 참고)

🔍 Metal2 on A11 — Tile Shading

  • 기존 (매번 사용할 때 마다 memory 로 옮김)
    - Device Memory → Tile Memory
  • Metal 2 (Render Phase 끝날 때 까지, Tile Memory 에 가져다 놓고 계속 사용)
    - Device Memory → Tile Memory
  • Thread Organization (pixel 그릴 부분을 Thread로 묶어서 dispatch)
Render Pass Setup
  • Pipeline Setup (Kernel / Fragment Function → Tile Render Pipeline Descriptor → Render Pipeline State)
  • Sample 참고

← Previous Post Next Post