Xcode 10.1 新特性及解決的問題

原文連接canvas

距離 Xcode 10.1 正式版發佈已經將近一個月了,咱們今天從新來回顧一下 Xcode 10.1 的新特性,以及已解決的問題和存在的問題。swift

本文主要參考了《Xcode 10.1 Release Notes》進行整理,同時你也能夠查閱《Xcode 10 Release Notes》獲取更多關於 Xcode 10 的細節。數組

接下來咱們將以新特性(New Features)、已解決的問題(Resolved Issues)、已知問題(Known Issues)等幾方面來介紹 Xcode 10.1 在各模塊上的更新。xcode

1. General / 通用

新特性

  • 支持 arm64e 處理器架構(預覽版)

若是你想嘗試尚處於開發者預覽版的 arm64e,請在 Xcode 項目編輯器中選擇你的 iOS app 對應的 target,在 Build Settings 中找到 "Architectures" 設置項,選擇 "Other…" 選項,而後添加手動添加 arm64e 到 architectures 列表中。架構

注:目前 App Store 和 TestFlight 並不接受包含 arm64e 的提交,因此當咱們 Archive 後在 Organizer 窗口要向蘋果提交發布時,Xcode 會自動移除掉 app 包中 arm64e 的內容。app

已解決的問題

  • 菜單中 Navigate > Open in… 的導航欄 UI 再也不將窗口中的各個 tabs 顯示爲單獨的窗口,每一個窗口都有一個 tab。編輯器

  • xed 工具如今使用由當前 xcode-selectDEVELOPER_DIR 環境變量指定的 Xcode。ide

2. Apple Clang Compiler / 蘋果 Clang 編譯器

已解決的問題

  • 對 iOS 12.1 beta 2 中的 libunwind 庫進行修改,解決了在 iPhone XS 和 iPhone XS Max 上運行少部分 app 的問題。

3. Asset Catalog / 資源目錄

已知問題

  • 項目中若是包含了 asset catalogs 並使用 Xcode 10.0 或者更高版本的構建的 app,且其 Deployment Target(指最低支持的系統版本)設爲 iOS 9.0、9.1 或者 9.2 時,會生成與這些 iOS 版本的運行時不兼容的內容(具體表現爲:在系統版本爲 9.0 ~ 9.2.1 之間的真機設備上經過 App Store 或者 TestFlight 下載安裝該 app 並運行,會出現偶現的 Crash)。

注:關於這個問題,相信你們已經很熟悉了,網上有不少討論,咱們以前也發了幾條相關的小集。它是在 Xcode 10.0 上開始出現的,而在 Xcode 10.1 剛發佈時,蘋果聲稱已經解決了,後面你們紛紛表示這個問題仍然存在。不過根據微博上的最新消息和小夥伴們的親自驗證,蘋果已經在服務端解決了這個問題,開發者經過 Xcode 10.1 打的 ipa 包在上傳到 App Store Connect 後臺,蘋果在處理包的過程當中會自動修復。函數

已解決的問題

  • 增長 40mm 和 44mm 的孔(wells)用於解決指定正確的圖標大小的難題。

4. Build System / 構建系統

已解決的問題

  • 新的構建系統支持「按需資源」(On Demand Resources,ODR)。工具

  • 修復了問題:在爲 .xib 文件或 storyboards 使用基本本地化時,不會將與基本文件關聯的各個本地化的 .xib 文件或 storyboards 編譯到產品中。

5. Debugging / 調試

新特性

  • 對於異常斷點(Exception Breakpoints)的斷點編輯器增長了一個 "ignore count" 字段。

6. Devices / 設備

已解決的問題

  • 運行 iOS 12 或更高版本的設備從 "Devices" 窗口中請求獲取屏幕截圖的問題。

7. Interface Builder / 界面構建工具

新特性

  • 如今,在畫布中拖動控件(Control-dragging)以添加約束老是包括全部四個方向,而不只僅是最接近拖動方向的方向。

已解決的問題

  • 修復了問題:在將視圖與 UIScrollView 的子視圖添加約束時, Auto Layout 會錯誤報告問題。

  • 提升了畫布(canvas)的性能:當底部設備欄在 iPhone XS、iPhone XS Max 和 iPhone XR 之間切換時。

  • 修復了致使預覽助手編輯器(Preview assistant editor)中監視內容佈局與設備欄選擇不匹配的問題。

  • 如今,當啓用 @IBDesignable 視圖時,將使用新的構建系統進行編譯。

8. Simulator / 模擬器

已知問題

  • 若是有另外一個進程,例如 simctl,在模擬器正在打開時關閉了模擬的設備,則模擬器在下次啓動設備時沒法正確地從新鏈接到模擬器。若是你安裝了多個版本的 Xcode,則在其餘版本的 Xcode 中運行模擬器是可能也會遇到這個問題。

*臨時解決方案:*退出並從新啓動模擬器。要在不關閉全部模擬器的狀況下退出,請先按住 Option 鍵並選擇 Simulator > Quit Simulator…,而後在出現的對話框中選擇 "Keep Running"。

9. Swift Compiler / Swift 編譯器

已知問題

  • 若是你在一個類的實例對象上經過使用 protocol 或 extension 中定義的 nonmutating setter 來間接修改屬性,則 Swift 編譯器可能會出現錯誤編譯:在調用該屬性的 getter 方法以後就直接釋放該實例對象。這可能會致使程序崩潰或在運行時出現不可預測的行爲。

例如:

protocol SomeProtocol { }
class SomeClass: SomeProtocol { }

extension SomeProtocol {
    var someNonmutatingProperty: CGPoint {
        nonmutating set { _ = self }
        get { return .zero }
    }
}

// Might be miscompiled, deallocating SomeClass() too early.
SomeClass().someNonmutatingProperty.x = 42
複製代碼

*臨時解決方案:*將該操做分解爲多個語句,以便 get 和 set 操做在不一樣的語句中發生:

let someObject = SomeClass()
// First get the nonmutating property value.
var temp = someObject.someNonmutatingProperty
temp.x = 42
// Then modify it.
someObject.someNonmutatingProperty = temp
複製代碼

已解決的問題

  • Xcode 中的 Playgrounds 再也不記錄關於在運行時類型沒法解碼的字段的信息。

  • 如今編譯 Swift 代碼時會始終報告致使任何失敗的錯誤。例如,以前可能會發生諸如 "Command CompileSwiftSources failed with a zeroo exit code" 之類的消息,而沒有伴隨的失敗緣由。

  • 包含空格的長文件路徑將不會再致使構建失敗。

  • NSBundle 類的 bundleForClass: 初始化方法如今與 Swift 類保持一致,包括即便不在最新的操做系統版本上運行。

  • 如今能夠將以函數類型做爲參數的泛型類的 "let property" 成功傳遞給另外一個函數或方法。

class A<B> {
    let function: (B) -> B
}
func takeFunction(_: (Int) -> Int) {}

func passFunction(from a: A<Int>) {
    takeFunction(a.function)
}
複製代碼
  • 對嵌套上下文中(nested context)的捕獲值所作的更改如今將反映在外部上下文中(outer context)。

  • 如今能夠成功調用一個在協議類型(protocol type)的值上返回 Self 的變異方法(mutating method):

protocol Example {
    mutating func test() -> Self
}

func foo(x: inout Example) {
    _ = x.test() // No longer crashes the compiler sometimes.
}
複製代碼
  • 編譯器如今能夠成功地將一個異構類對象(heterogeneous class objects)數組生成爲 AnyObject 數組:
func f(_: [AnyObject])

f([NSObject.self, NSString.self])
複製代碼

10. Swift Standard Library / Swift 標準庫

已解決的問題

  • FixedWidthInteger 協議中的 unsafeAdding(_:)unsafeSubtracting(_:)unsafeDivided(by:), 以及 unsafeMultiplied(by:) 等方法已棄用(deprecated),並將在之後的版本中刪除。

這些方法在溢出條件下會產生未定義的行爲。所以在算術運算的狀況下,可使用 assertaddingReportingOverflow(_:) 方法或者 &+ 運算符的組合,這二者都會在溢出的狀況下有明肯定義的結果。

11. Source Control / 代碼控制管理

已解決的問題

  • 當從 GitLab.com 或者 GitLab 自託管帳戶進行克隆(cloning)倉庫時,組織倉庫(organizational repositories)目前能夠與我的倉庫(personal repositories)一塊兒顯示了。

12. Testing / 測試

已知問題

  • 當開啓並行化測試(test parallelization)時,性能分析測試(profiling tests)的結果不能正確地表現。

*臨時解決方案:*當進行分析測試時能夠經過以下方式禁用並行測試:在 Xcode 菜單欄中打開 Product > Scheme > Edit Scheme... > Test > Info,選擇測試 target 旁邊的 "Options" 按鈕,而後禁用 "Execute in parallet" 複選框。

已解決的問題

  • 使用舊版構建系統(legacy build system)的項目中的 UI 測試,目前可支持在 iPhone XS 和 iPhone XS Max 上運行了。

  • 若是一個 UI 測試的目標 app 在模擬器上進行測試期間崩潰了,則如今能夠將其正確地報告爲測試失敗,而不是像以前那樣被錯誤地視爲成功測試,或者顯示有關 "Application state unknown" 失敗信息。

  • Xcode 10.1 beta 2 及更高版本支持在運行 iOS 12 beta 版的設備上進行 UI 測試。

  • 修復了若是在測試已經開始後的任什麼時候刻添加觀察者,則此時添加到 XCTestObservationCenter 共享實例對象上的觀察者的 testBundleDidFinish: 方法不會被調用的問題(例如:在全部當前註冊的觀察者上調用了 testBundleWillStart: 方法以後)。

  • 當接收器(receiver)是一個菜單項或者菜單項的子視圖時, XCUIElement 類的 clickhover 方法如今能夠自動滾動菜單了。

參考鏈接

注:本文翻譯內容若有描述不許確的地方,請參考上述英文原文。

相關文章
相關標籤/搜索