Xcode 10.2

知識小集發表於2019-03-27

原文連結

蘋果在這次春季釋出會後,正式釋出了 Swift 5 ,正式開啟了 Swift ABI 穩定時代。與 Swift 5 一起,蘋果釋出了 Xcode 10.2,以支援 Swift 5 的開發。這個版本的 Xcode 新增了不少特性,同時解決了大量問題。我們翻譯了 Xcode 10.2 Release Notes 文件,以方便大家瞭解 Xcode 10.2。

文章比較長,建議主要了解新特性部分。由於整理匆忙,翻譯有誤之處還請留言指正。

Xcode 10.2

• 包含的 SDK:iOS 12.2, watchOS 5.2, macOS 10.14.4, tvOS 12.2

• 支援裝置上除錯的系統:iOS 8+, tvOS 9+, watchOS 2+

• macOS 系統要求:10.14.3+

通用

新特性

• 支援使用 macOS 內容快取進行下載。

已解決的問題

• 解決了上傳到 App Store 不包含符號資訊的問題。

Apple Clang Compiler

新特性

-Watomic-implicit-seq-cst 是一個新的警告標識,預設情況下是關閉的,當以隱式的、順序一致的方式使用 C 語言的 _Atomic__sync_*,會發出警告。大多數程式碼庫預設使用順序一致性(sequential consistency),但有些要求開發人員在r所有地方使用顯式排序。此警告適用於後一種情況。(28172966)

• 使用引用包含(quote includes)的新診斷標識 framework header 代替了樣式包含(style includes)的 framework。預設情況下警告是關閉,但可以設定 clang 的 -Wquoted-include-in-framework-header 標識來啟用它。(37077034)

-Wmemset-transposed-args 是一個新的警告標識,用於診斷對轉換了第二個和第三個引數的 memset 的呼叫。例如,memset(buf, sizeof(buf), 0) 這個呼叫會使用新警告診斷。(42360478)

std::pair 的建構函式有條件的標記為 noexcept,依據是其成員的相應建構函式是否為 noexcept。這是一個符合標準的擴充套件,具有潛在的效能優勢,在那些構造時不會丟擲異常的型別上執行更快的構造操作。(29537079)

• 在 std::mapstd::set 中使用 non-const 可呼叫謂詞的警告現在顯示了錯誤容器的例項化資訊而不是不相關的實現細節。(41370747)

• 不推薦使用 <experimental/any><experimental/optional> headers,而使用新的 C++ 17 的 header:<any><optional>。它們將在 Xcode 的未來版本中刪除,不應該依賴它們的存在。(46903112)

• 已刪除使用內聯巨集來控制 libc++ headers 中符號的可見性,以支援更好的解決方案。這將優化包含 libc++ headers 的程式碼的大小和效能,以及顯著改善使用 libc++ 時的除錯體驗。(47259325)

• 框架中的公共 headers 可能會錯誤地 #import#include 私有 header,這會導致分層違規和潛在的模組引用迴圈。有一種新的診斷報告了這種違規行為。預設情況下它在 clang 中是關閉的,由 -Wframework-include-private-from-public 標識控制。 (38712182)

• 在框架 headers 中使用 @import 可防止在沒有模組的情況下使用 headers。一個新的診斷標識在你傳遞 -fmodules 標識時會檢測框 headers 中是否使用 @import。預設情況下,這個診斷在 clang 中是關閉的,並使用 -Watimport-in-framework-header 標誌進行控制。(39192894)

• 以前,在為框架宣告模組時省略 framework 關鍵字不會影響編譯,但是默默地做了錯誤的事情。一個新的診斷(-Wincomplete-framework-module-declaration)和一個新的修復建議新增適當的關鍵字。預設情況下,將 -fmodules 標誌傳遞給 clang 時,此警告處於啟用狀態。(39193062)

已解決的問題

• 修復了在檢查 future 是否已附加到 std::async 中的 promise 時發生的資料競爭情況。解決了 std::async 返回一個 non-void future 的問題,但對於返回 std::future<void> 的呼叫,該問題仍然存在。(42548261)

• 即使從命令列呼叫 clang 以在單個呼叫中進行編譯和連結時使用 -flto=thin 啟用增量 LTO,連結也會成功。(47297739)

• 現在可以正確處理 std::regex 中的反轉字元類,例如 [\S]。(43060054)

dsymutil 不再耗盡大型專案的系統記憶體。(41422573)

Asset Catalog

已解決的問題

• 解決了在為本地或企業分發應用程式時影響應用程式與 iOS 9.0、9.1 和 9.2 上的相容性問題。使用 Xcode 10 構建的應用程式其 Asset Catalog(部署目標為 iOS 9.0,9.1 或 9.2)在使用本地或企業釋出分發時生成的內容與這些 iOS 版本的執行時不相容。使用 Xcode 10.2 重新構建應用程式可以解決此問題。(46893768,44535967)

• 改善了 Dark Mode 下的影象切片模式。(39388416)

構建系統

新特性

Implicit Dependencies 現在支援在 Other Linker Flags 中查詢使用 -framework-weak_framework-reexport_framework-lazy_framework-weak-l-reexport-l-lazy-l-l 指定的連結框架和庫的依賴關係。(7879587)

已知問題

• 如果您正在構建包含 Swift 程式碼的 framework 並使用 lipo 建立支援裝置和模擬器平臺的二進位制檔案,則還必須合併為每個平臺生成的 Framework-Swift.h 標頭檔案以建立支援裝置和模擬器的標頭檔案。(48635615)

例如,如果您已經構建:

- iOS/Framework.framework
- iOS Simulator/Framework.framework
複製程式碼

得到:

- iOS/Framework.framework/Headers/Framework-Swift.h
- iOS Simulator/Framework.framework/Framework-Swift.h
複製程式碼

建立一個新的:

- iOS + iOS Simulator/Framework.framework/Headers/Framework-Swift.h
複製程式碼

新 Framework-Swift.h 的內容應該是:

#if TARGET_OS_SIMULATOR
<contents of original iOS Simulator/Framework.framework/Framework-Swift.h>
#else
<contents of original iOS/Framework.framework/Framework-Swift.h>
#endif
複製程式碼

已解決的問題

• 當用作目標依賴項時,外部目標是正確排序的。(44775299)

• 解決了在啟用 COMBINE_HIDPI_IMAGESAPPLY_RULES_IN_COPY_FILES 設定時導致 Xcode 將 PNGJPEG 檔案作為 TIFF 檔案處理的問題。(44623214)

OTHER_INPUT_FILE_FLAGS 構建設定(傳播原始檔的自定義標誌)現在可用於使用新構建系統時的自定義規則指令碼。(46067251)

.xcconfig 檔案中的遞迴包含迴圈不再使構建系統崩潰。(42023748)

• 現在,目標構建階段中為 Core Data 模型檔案定義的每個檔案標誌將傳遞給 Core Data 編譯器。(42919919)

Clang 靜態分析器

已解決的問題

• 靜態分析器現在會在使用內容被移動後的 C++ 物件時發出警告,除非在使用物件之前將其重置為已知狀態。(41349073)

• 靜態分析器現在檢查是否違反了 IOKitlibkern 的引用計數規則。這些違規行為可能導致洩密和 use-after-free 的問題。(46359592)

除錯

新特性

• UIStackView 屬性現在可以顯示在檢視偵錯程式物件檢查器中。(36351873)

• 如果在除錯時遇到記憶體資源異常,Xcode 現在可以自動捕獲記憶體圖。您可以在方案的執行設定 “Diagnostics” 選項卡中啟用記憶體圖捕獲。(45285932)

• 在 iOS 和 watchOS 上,當接近記憶體限制時,Xcode 會在 Memory Report 中顯示執行應用程式的記憶體限制。使用 InstrumentsXcode Memory Debugging 來優化您的應用程式,以儘可能減少記憶體佔用。(40556954)

• 檢視偵錯程式呈現更緊湊的3D佈局。(43523921)

已解決的問題

• 在 Assistant Editor 中顯示反彙編的速度得到了改進。(31633031)

文件檢視器

新功能

• 可以通過 SDK 可用性、引入版本和棄用來過濾符號文件。還可以過濾文件以僅顯示文章或示例程式碼。例如,您可以過濾文件以顯示 UIKit 等框架所有示例程式碼。(45236860)

Instruments

已知的問題

• 在 watchOS 應用程式中 profile Swift 程式碼時,Instruments 可能會崩潰。(47368181)

Interface Builder

新功能

• 雙擊 storyboard 不再縮放。相反,使用觸控板上的捏合手勢或按住 Option 並滾動來進行縮放。 (29139870)

• Apple TV 的 Interface Builder 支援 TVUIKit 框架公開的使用者介面元素。 (35868606)

已解決的問題

• 修復了在重新開啟 storyboard 後選中 Bindings inspector 中的 Bind to 核取方塊時可能發生的崩潰。(33348238)

• Interface Builder 預覽中的旋轉按鈕在 Dark Mode 下可見。 (42396497)

• 使用 @objc @IBAction 註釋時,Interface Builder 可以正確解析 Swift 檔案中的 Actions。 (25465675)

• 在資源目錄中指定的對齊矩形的影象在 Interface Builder 畫布中正確呈現。 (46595020)

• 改進了如果 asset catalog 中的檔名不以 @2x 或 @3x 結尾,在 Interface Builder 畫布中的 2x 和 3x 插槽中影象的固有大小。(44759471)

• 使用檢查器對 NSImageView 所做的更改現在可以毫無延遲地可靠地反映在畫布中。 (30196881)

ibtool --export-string-file 包含在具有 NSCell 例項的控制元件上指定的本地化提示。(24421623)

• 解決了導致影象在 storyboards 中顯示為問號的問題。(42475635)

• 在 Interface Builder 畫布中呈現的影象使用與所選裝置匹配的比例因子進行渲染。(18703159)

• 在 asset catalog 中使用模板呈現模式標記的影象在 Interface Builder 畫布中正確呈現。(29049562)

連結

已解決的問題

• 當主專案沒有用 Swift 編寫時,現在可以在 dyld 快取中找到 Swift 庫。 (48385698)

• 解決了導致連結器錯誤在問題導航器中顯示為“Linker command failed with exit code 1”而不是顯示實際錯誤訊息的問題。 (39141740)

LLDB偵錯程式

新功能

• 現在可以在閉包內的LLDB表示式評估中使用 $0$1,...。(20719448)

• LLDB 現在支援 C 變長陣列。(39606394)

• LLDB偵錯程式有一個新的命令別名 v,用於“frame variable”命令,用於在當前堆疊幀中列印變數。因為它繞過表示式求值程式,所以 v 可以快得多,並且應優先於 p 或 po。(40066460)

已解決的問題

• 偵錯程式現在可以解析繫結到私有型別的泛型變數的型別。(38231646)

• 在 Swift 中使用 po 除錯 watchOS 應用程式時,現在返回正確的結果。(47162433)

• 偵錯程式正確支援內聯泛型上下文中的泛型變數。(28859432)

• Swift 詞典和集合的資料格式化程式更可靠。 (43045289)

本地化

新功能

• 開啟使用任何已棄用的本地化識別符號的專案現在會為每個使用的識別符號生成警告。選擇其中一個警告會提供一個助手,用於將關聯的舊“lproj”目錄中的檔案遷移到以等效新識別符號命名的“lproj”目錄。如有必要,此過程還會將專案的開發區域更新為新識別符號。遷移的專案與舊版本的 Xcode 相容。(9777671)

• 現在可以為專案開發區域匯出和匯入本地化資訊。(41878212)

已解決的問題

• Xcode 現在更仔細地區分遺留的本地化識別符號(如“English”)和現代本地化識別符號(如“en”),並在專案檔案和使用者介面中同時表示它們。(45469882)

• 建議對所有專案啟用 Base Internationalization,並且為任何當前不使用 Base Internationalization 的專案提供升級,即使它們只有一個本地化。升級後的專案與以前版本的 Xcode 向後相容。(15160454)

• 現在可以將本地化新增到沒有任何本地化檔案的專案中,並且不會提示您將檔案複製到新的本地化目錄。(42771349)

Playgrounds

新功能

• Playgrounds 現在在執行時執行記憶體安全檢查。違反對記憶體陷阱的獨佔訪問的程式碼,會給出診斷訊息:“Simultaneous accesses to […], but modification requires exclusive access.”(SR-8126)(33820622)

已解決的問題

• 解決了阻止 Playgrounds 執行的問題。(47226381)

• 修復了使用輔助原始碼編輯 Playgrounds 時可能發生的崩潰。(42097728)

• 修復了編輯包含佔位符的片段時可能發生的崩潰問題。(43242401)

• 修復了一個問題,該問題可能會影響 Interface Builder 文件中的更改在不關閉工作區視窗的情況下反映在 Playgrounds 中。(46830864)

重構

已解決的問題

• 重新命名重構現在正確地重新命名帶有外部引數標籤的單個引數的函式,並且具有將相應引數作為尾隨閉包傳遞的呼叫點。(42162571)

• 使用 Refactoring > Rename 重新命名 document 現在會更新應用程式的 Info.plist 檔案以作匹配 (41327509)

模擬器

已解決的問題

• 改善了與模擬裝置互動的效能和響應能力。(47864185)

• 解決了無法在具有大量模擬裝置的 Mac 上啟動模擬裝置的問題。(47712686)

• 解決了將多個聯絡人,照片或視訊專案同時拖動到模擬裝置視窗時發生的故障。(46736098)

• macOS 和模擬 iOS 裝置之間的貼上板同步更可靠。(46817121)

• 現在,您只需提示一次授權麥克風訪問,就可以使用所有模擬器裝置。(45715977)

• iPhone XR 模擬器的互動效能和響應能力已得到改進。 (44657262)

Source Control

新功能

• Xcode 使用 SSH 配置輸出來確定應該使用哪個 SSH 金鑰對來驗證給定的遠端倉庫。 (47302670)

已解決的問題

• 除了用於連線到 Git 伺服器的 PEM 格式之外,Xcode 現在還支援使用 OpenSSH 格式的 SSH 私鑰。 (40867126)

• 解決了導致 SSH 金鑰密碼 keychain 查詢失敗的問題。(47578552)

程式碼編輯

新功能

• “Fold Methods & Functions” 編輯器選單項可以摺疊 Swift 中的計算屬性。(43428274)

• Code completion 在計算屬性宣告中提供 get,set,didSet 和 willSet 作為可能的實現。(20957182)

• 在可選列舉型別的上下文中,除了 Optional.noneOptional.some(_:) 之外,code completion 會提示列舉的其它 case。(23549753)

已解決的問題

• 重寫 UITableViewController 方法時,Code completion 不會出現重複的委託方法名稱。(21161476)

• 引用不同的檔案的 Fix-its 操作將不適用於當前檔案。(31371021)

• 被拖動的文字顯示為透明影象。(31890166)

• 程式碼編輯器現在使用系統顏色作為佔位符。(32307338)

• 在佔位符之前直接鍵入換行符時,編輯器不會填充佔位符。(32853933)

• 修復瞭如果包含標記的行已被編輯,則使用 Mark 在 Swap 中發生崩潰 (41874263)

• 開啟摺疊功能區時,編輯器中的打字和滾動效能得到改進。 (42941556)

• 修復了換行的一致性。 (44520372)

• 修復了顯示三個助理編輯器時發生的崩潰。 (45230485)

• 修復了輸入具有多個遊標的換行符時發生的崩潰。 (45601228)

• 當關閉換行時,提高了使用摺疊程式碼滾動原始檔的速度。 (45712602)

• 改進了使用黑暗主題時警告和問題的顯示。 (44925116)

(略)

Swift

• 請參閱 Swift 5 Release Notes for Xcode 10.2 developer.apple.com/documentati…

測試

新功能

xccov 支援將多個覆蓋報告及其關聯的歸檔合併到一個彙總報告和歸檔中。將報表合併在一起時,對於在生成原始報表之間發生更改的原始檔,聚合報表可能不準確。如果沒有程式碼更改,則彙總報告和存檔會是準確的。有關更多資訊,請參閱 xccov 手冊頁。 (38050969)

• xccov 現在支援區分 Xcode 覆蓋率報告,可用於計算覆蓋範圍隨時間的變化。 (43439165)

• 靜態庫和框架目標現在作為頂級條目顯示在 coverage 報告中,其中行覆蓋值在包含靜態庫或框架的所有目標中聚合。這也解決了靜態庫或框架目標的原始檔將包含在 coverage 報告中的問題,即使目標本身已從方案中的程式碼覆蓋範圍中排除。(22578123)

已知的問題

• Swift initializers 顯示在覆蓋率報告中,沒有名稱。(47467864)

• 啟用 Parallelization 時,Clones 中的錄製無效。 (43699252)

• 如果同一 PRODUCT_NAME 存在多個測試主機目標,則會為測試目標選擇錯誤的測試主機應用。(46475115)

• 啟用測試並行化時,效能分析測試不正常。 (44836817)

解決方法:導航到 Product > Scheme > Edit Scheme > Test > Info,選擇測試目標旁邊的 Options ,並禁用“Execute in parallel”,以在分析時禁用並行測試。

已解決的問題

• 解決了導致 Swift 原始檔中的方法在 coverage 報告中命名為“Definition at <line>:<column>”的問題。(46432533)

XCUIScreen 現在正確實現了 isEqual:hash。(32179407)

• 當單擊程式碼編輯器以獲取存在於多個測試目標中的測試方法或類時,或者對於由子類繼承的測試方法時,Xcode 現在會顯示一個選單,允許選擇要執行的單個目標或類(或全部)選定的測試。(45975871)

• 解決了可能阻止在 coverage 報告檢視中展開檔案的問題。(44458167)

• 如果由於某種原因(例如執行時連結失敗)在測試期間無法載入測試包,Xcode 現在會報告描述失敗原因的描述性錯誤訊息。如果您正在使用 xcodebuild,則此失敗資訊存在於測試活動日誌中並顯示在 stdout 中。結果包中包含的結構化日誌中也存在該錯誤。 (45242409)

• 如果由於測試執行器在啟動時崩潰而導致測試失敗,Xcode 會嘗試生成描述失敗的詳細錯誤訊息。如果您正在使用 xcodebuild,則此失敗存在於測試活動日誌中並顯示在 stdout 中。結果包中包含的結構化日誌中也存在該錯誤。(29148418)

• 如果在測試執行時 xcodebuild 被 SIGINT 訊號終止,則會將有效的結果包寫入磁碟,幷包含在終止之前完成的測試的結果。同樣,如果取消在 Xcode 中執行測試,則會生成一個包含已完成測試結果的有效結果包。(45022325)

• xcodebuild 或 Xcode 的第二個例項不會刪除在並行分散式測試期間建立的模擬器拷貝。(40738122)

• 解決了可能導致多個目標中包含的檔案的程式碼覆蓋率不正確的問題。(40409346)

• 在測試期間收集的崩潰報告不再遺漏重要欄位,例如終止原因和描述。(44405884)

• 未明確包含在目標的 Headers Build Phase 中的 headers 不再出現在 coverage 報告中的目標條目中。這解決了一個問題,其中不需要的 headers 可能出現在目標的覆蓋率報告中 - 例如來自連結的框架或庫。如果您發現覆蓋率報告缺少 header,請確保它們包含在相應目標的 Headers Build Phase 中。 (36187447)

• 具有多個測試目標的專案(每個測試目標包含一個繼承自共享 XCTestCase 子類的測試類)不再顯示來自其他目標的不存在的執行時(“rT”)測試。(46042417)

關注我們

歡迎關注我們的公眾號:zsxjtip,也歡迎加入我們的群組討論問題。可以加微信 coldlight_hh/wsy9871 進入我們的 iOS/flutter 微信群。

Xcode 10.2

相關文章