Xcode 10.2
文章比较长,建议主要了解新特性。由于编辑比较仓促,如有翻译错误请留言指正。包含的 SDK:iOS 12.2、watchOS 5.2、macOS 10.14.4、tvOS 12.2. 支持使用macOS 内容缓存进行下载。修复了上传到App Store 时不包含符号信息的问题。警告默认情况下处于关闭状态,但可以通过设置 clang 的 -Wquoted-include-in-framework-header 标志来启用。已弃用 and 标头,取而代之的是新的 C++17 标头:and。它们将在 Xcode 的未来版本中被删除,并且不应依赖它们的存在。默认情况下,此诊断在 clang 中关闭,并由 -Watimport-in-framework-header 标志控制。修复了检查未来是否附加到std::async 中的promise 时的数据争用。使用 Xcode 10 构建的应用程序在使用本地或企业版本分发时会生成与这些 iOS 版本的运行时不兼容的内容。使用 Xcode 10.2 重建应用程序可以解决该问题。
今年春季发布会之后,苹果正式发布了 Swift 5,正式开启了 Swift ABI 稳定时代。 与 Swift 5 一起,Apple 还发布了 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 时不包含符号信息的问题。
苹果 Clang 编译器
新功能
• -Watomic-implicit-seq-cst 是一个新的警告标志,默认情况下关闭,并在以隐式、顺序一致的方式使用C 语言的_Atomic 或__sync_* 时发出警告。 大多数代码库默认使用顺序一致性,但有些代码库要求开发人员在任何地方都使用显式排序。 此警告适用于后一种情况。 (28172966)
• 替换样式包括框架,并带有引用包括的新诊断标志框架标头。 警告默认情况下处于关闭状态,但可以通过设置 clang 的 -Wquoted-include-in-framework-header 标志来启用。 (37077034)
• -Wmemset-transpose-args 是一个新的警告标志,用于诊断第二个和第三个参数调换后对 memset 的调用。 例如,对 memset(buf, sizeof(buf), 0) 的调用将使用新的警告诊断。 (42360478)
• std::pair 的构造函数有条件地标记为 noexcept,具体取决于其成员的对应构造函数是否为 noexcept。 这是一个一致的扩展,具有潜在的性能优势,可以对构造时不抛出异常的类型执行更快的构造操作。 (29537079)
• 在std::map 或std::set 中使用非常量可调用谓词的警告现在显示错误容器的实例化信息,而不是不相关的实现细节。 (41370747)
• 已弃用 and 标头,取而代之的是新的 C++17 标头:and。 它们将在 Xcode 的未来版本中被删除,并且不应依赖它们的存在。 (46903112)
• 已删除使用内联宏来控制libc++ 标头中符号的可见性,以支持更好的解决方案。 这将优化包含 libc++ 标头的代码的大小和性能,并显着改善使用 libc++ 时的调试体验。 (47259325)
• 框架中的公共标头可能会错误地#import 或#include 私有标头,这会导致分层违规和潜在的模块引用循环。 有一个新的诊断报告了这种违规行为。 默认情况下,它在 clang 中处于关闭状态,由 -Wframework-include-private-from-public 标志控制。 (38712182)
• 在框架标头中使用@import 可防止在没有模块的情况下使用标头。 当您传递 -fmodules 标志时,新的诊断标志会检测框标头中是否使用 @import。 默认情况下,此诊断在 clang 中关闭,并由 -Watimport-in-framework-header 标志控制。 (39192894)
• 以前,在为框架声明模块时省略framework 关键字不会影响编译,但却默默地做了错误的事情。 新的诊断(-Wincomplete-framework-module-declaration)和新的修复建议添加适当的关键字。 当 -fmodules 标志传递给 clang 时,默认情况下会启用此警告。 (39193062)
已解决的问题
• 修复了检查未来是否附加到std::async 中的promise 时的数据争用。 修复了 std::async 返回非 void future 的问题,但对于返回 std::future 的调用,问题仍然存在。 (42548261)
• 当从命令行调用clang 以在单次调用中进行编译和链接时,即使使用-flto=thin 启用了增量LTO,链接也会成功。 (47297739)
• 现在可以正确处理std::regex 中的反转字符类(例如[\S])。 (43060054)
• dsymutil 不再占用大型项目的系统内存。 (41422573)
资产目录
已解决的问题
• 解决了分发应用程序供本地或企业使用时影响 iOS 9.0、9.1 和 9.2 上的应用程序的兼容性问题。 使用 Xcode 10 构建的应用程序(其资产目录(部署目标是 iOS 9.0、9.1 或 9.2))在使用本地或企业版本分发时会生成与这些 iOS 版本的运行时不兼容的内容。 使用 Xcode 10.2 重建应用程序可以解决该问题。 (46893768, 44535967)
• 改进了深色模式下的图像切片模式。 (39388416)
构建系统
新功能
• 隐式依赖关系现在支持在其他链接器标志中查找使用-framework、-weak_framework、-reexport_framework、-lazy_framework、-weak-l、-reexport-l、-lazy-l 和-l 指定的链接框架和库的依赖关系。 (7879587)
已知的问题
• 如果您正在构建包含Swift 代码的框架并使用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
#else
#endif
已解决的问题
• 当用作目标依赖项时,外部目标的顺序正确。 (44775299)
• 修复了启用COMBINE_HIDPI_IMAGES 和APPLY_RULES_IN_COPY_FILES 设置时导致Xcode 将PNG 和JPEG 文件视为TIFF 文件的问题。 (44623214)
• 使用新的构建系统时,OTHER_INPUT_FILE_FLAGS 构建设置(传播源文件的自定义标志)现在可用于自定义规则脚本。 (46067251)
• .xcconfig 文件中的递归包含循环不再使构建系统崩溃。 (42023748)
• 在目标构建阶段为Core Data 模型文件定义的每个文件标志现在会传递到Core Data 编译器。 (42919919)
Clang 静态分析器
已解决的问题
• 现在,静态分析器会在使用内容已移动的 C++ 对象时发出警告,除非该对象在使用前重置为已知状态。 (41349073)
• 静态分析器现在检查是否违反IOKit 和libkern 的引用计数规则。 这些违规行为可能会导致泄漏和释放后使用问题。 (46359592)
调试
新功能
• UIStackView 属性现在可以显示在视图调试器对象检查器中。 (36351873)
• 如果调试时遇到内存资源异常,Xcode 现在可以自动捕获内存映射。 您可以在场景的运行设置“诊断”选项卡中启用内存图表捕获。 (45285932)
• 在iOS 和watchOS 上,当接近内存限制时,Xcode 在内存报告中显示正在运行的应用程序的内存限制。 使用 Instruments 和 Xcode 内存调试来优化您的应用程序,以尽可能降低内存占用。 (40556954)
• 视图调试器呈现更紧凑的3D 布局。 (43523921)
已解决的问题
• 提高了助理编辑器中显示反汇编的速度。 (31633031)
文档查看器
新功能
• 符号文档可以按SDK 可用性、引入版本和弃用进行过滤。 还可以过滤文档以仅显示文章或示例代码。 例如,您可以过滤文档以显示 UIKit 等框架的所有示例代码。 (45236860)
仪器
已知的问题
• 在watchOS 应用程序中分析Swift 代码时,仪器可能会崩溃。 (47368181)
界面生成器
新功能
• 双击故事板不再缩放。 相反,请在触控板上使用捏合手势或按住 Option 并滚动以进行缩放。 (29139870)
• Interface Builder for Apple TV 支持TVUIKit 框架公开的用户界面元素。 (35868606)
已解决的问题
• 修复了重新打开故事板后在绑定检查器中选择“绑定到”复选框时可能发生的崩溃。 (33348238)
• Interface Builder 预览中的旋转按钮在暗模式下可见。 (42396497)
• 当使用@objc@IBAction 进行注释时,Interface Builder 可以正确解析Swift 文件中的操作。 (25465675)
• 资源目录中指定的对齐矩形图像可以在Interface Builder 画布中正确呈现。 (46595020)
• 如果资产目录中的文件名不以@2x 或@3x 结尾,则改进了Interface Builder 画布中2x 和3x 插槽中图像的固有大小。 (44759471)
• 使用检查器对 NSImageView 所做的更改现在可以毫无延迟地可靠地反映在画布中。 (30196881)
• ibtool --export-string-file 包含在具有 NSCell 实例的控件上指定的本地化提示。 (24421623)
• 修复了导致图像在故事板中显示为问号的问题。 (42475635)
• Interface Builder 画布中渲染的图像使用与所选设备匹配的比例因子进行渲染。 (18703159)
• 使用模板渲染模式在资产目录中标记的图像可以在Interface Builder 画布中正确渲染。 (29049562)
关联
已解决的问题
• 当主项目不是用Swift 编写时,现在可以在dyld 缓存中找到Swift 库。 (48385698)
• 修复了导致链接器错误在问题导航器中显示为“链接器命令失败,退出代码为1”而不是实际错误消息的问题。 (39141740)
LLDB调试器
新功能
• 现在可以在闭包内的LLDB 表达式求值中使用$0、$1、...。 (20719448)
• LLDB 现在支持C 可变长度数组。 (39606394)
• LLDB 调试器为“帧变量”命令提供了一个新命令别名 v,用于打印当前堆栈帧中的变量。 因为它绕过表达式求值器,所以 v 可以更快,并且应该优先于 p 或 po。 (40066460)
已解决的问题
• 调试器现在可以解析绑定到私有类型的泛型变量的类型。 (38231646)
• 在Swift 中使用po 调试watchOS 应用程序现在可以返回正确的结果。 (47162433)
• 调试器正确支持内联通用上下文中的通用变量。 (28859432)
• 更强大的Swift 词典和集合数据格式化程序。 (43045289)
本土化
新功能
• 打开使用任何已弃用的本地化标识符的项目现在会针对每个使用的标识符生成警告。 选择这些警告之一可提供帮助程序,用于将关联的旧“lproj”目录中的文件迁移到以等效新标识符命名的“lproj”目录。 如有必要,此过程还会使用新标识符更新项目的开发区域。 迁移的项目与旧版本的 Xcode 兼容。 (9777671)
• 现在可以导出和导入项目开发区域的本地化信息。 (41878212)
已解决的问题
• Xcode 现在可以更仔细地区分传统本地化标识符(例如“English”)和现代本地化标识符(例如“en”),并在项目文件和用户界面中表示它们。 (45469882)
• 建议为所有项目启用基础国际化,并为当前未使用基础国际化的任何项目提供升级,即使它们只有一种本地化。 升级后的项目向后兼容以前版本的 Xcode。 (15160454)
• 现在可以将本地化添加到没有任何本地化文件的项目中,并且系统不会提示您将文件复制到新的本地化目录。 (42771349)
游乐场
新功能
• Playgrounds 现在在运行时执行内存安全检查。 违反内存陷阱独占访问的代码会给出诊断消息:“同时访问 […],但修改需要独占访问。” (SR-8126) (33820622)
已解决的问题
• 修复了阻止 Playgrounds 执行的问题。 (47226381)
• 修复了使用辅助源编辑 Playground 时可能发生的崩溃。 (42097728)
• 修复了编辑包含占位符的剪辑时可能发生的崩溃。 (43242401)
• 修复了在不关闭工作区窗口的情况下可能导致 Interface Builder 文档中的更改无法反映在 Playgrounds 中的问题。 (46830864)
重构
已解决的问题
• 重命名重构现在可以正确重命名具有带有外部参数标签的单个参数的函数,并且具有将相应参数作为尾随闭包传递的调用站点。 (42162571)
• 使用重构重命名文档 > 重命名现在会更新应用程序的 Info.plist 文件以匹配 (41327509)
模拟器
已解决的问题
• 改进了与模拟设备交互的性能和响应能力。 (47864185)
• 解决了模拟设备无法在具有大量模拟设备的Mac 上启动的问题。 (47712686)
• 解决了同时将多个联系人、照片或视频项目拖至模拟设备窗口时发生的崩溃问题。 (46736098)
• macOS 和模拟iOS 设备之间更可靠的粘贴板同步。 (46817121)
• 您现在可以使用所有模拟器设备,只需一个提示即可授权麦克风访问。 (45715977)
• iPhone XR 模拟器的交互性和响应能力得到了改进。 (44657262)
源代码控制
新功能
• Xcode 使用SSH 配置输出来确定应使用哪个SSH 密钥对来验证给定的远程存储库。 (47302670)
已解决的问题
• 除了用于连接到Git 服务器的PEM 格式之外,Xcode 现在还支持OpenSSH 格式的SSH 私钥。 (40867126)
• 解决了导致SSH 密钥的密码钥匙串查找失败的问题。 (47578552)
代码编辑
新功能
• “折叠方法和函数”编辑器菜单项可折叠 Swift 中的计算属性。 (43428274)
• 代码完成提供 get、set、didSet 和 willSet 作为计算属性声明中的可能实现。 (20957182)
• 在可选枚举类型的上下文中,代码完成将建议除Optional.none 和Optional.some(_:) 之外的其他枚举情况。 (23549753)
已解决的问题
• 重写UITableViewController 方法时,代码完成不会重复委托方法名称。 (21161476)
• 引用不同文件的修复操作将不适用于当前文件。 (31371021)
• 拖动的文本显示为透明图像。 (31890166)
• 代码编辑器现在使用系统颜色作为占位符。 (32307338)
• 当您直接在占位符之前键入换行符时,编辑器不会填充占位符。 (32853933)
• 修复了如果包含标记的行已被编辑,则“与标记交换”中的崩溃 (41874263)
• 改进了打开折叠功能区时编辑器中的键入和滚动性能。 (42941556)
• 固定换行一致性。 (44520372)
• 修复了显示三个助理编辑器时的崩溃问题。 (45230485)
• 修复了使用多个光标输入换行符时发生的崩溃。 (45601228)
• 改进了关闭换行时带有折叠代码的源文件的滚动。 (45712602)
• 改进了使用深色主题时警告和问题的显示。 (44925116)
(轻微地)
迅速
• 请参阅Xcode 10.2 的Swift 5 发行说明。
测试
新功能
• xccov 支持将多个覆盖率报告及其相关档案合并为一个摘要报告和档案。 将报告合并在一起时,对于在生成原始报告期间发生更改的源文件,聚合报告可能不准确。 如果没有代码更改,摘要报告和档案将是准确的。 有关详细信息,请参阅 xccov 手册页。 (38050969)
• xccov 现在支持差异化的Xcode 覆盖率报告,可用于计算覆盖率随时间的变化。 (43439165)
• 静态库和框架目标现在在覆盖率报告中显示为顶级条目,其中行覆盖率值在包含静态库或框架的所有目标上进行聚合。 这还解决了静态库或框架目标的源文件将包含在覆盖率报告中的问题,即使目标本身已从场景中的代码覆盖率中排除。 (22578123)
已知的问题
• Swift 初始值设定项出现在覆盖率报告中,但没有名称。 (47467864)
• 启用并行化时,克隆中的记录不起作用。 (43699252)
• 如果同一 PRODUCT_NAME 存在多个测试主机目标,则会为测试目标选择错误的测试主机应用程序。 (46475115)
• 启用测试并行化时,分析测试无法正确运行。 (44836817)
解决方法:导航到“产品”>“方案”>“编辑方案”>“测试”>“信息”,选择测试目标旁边的“选项”,然后禁用“并行执行”以在分析时禁用并行测试。
已解决的问题
• 修复了导致 Swift 源文件中的方法在覆盖率报告中被命名为“Definition at:”的问题。 (46432533)
• XCUIScreen 现在可以正确实现isEqual: 和散列。 (32179407)
• 当单击多个测试目标中存在的测试方法或类的代码编辑器,或者子类继承的测试方法时,Xcode 现在会显示一个菜单,允许选择要运行的单个目标或类(或全部)测试。 (45975871)
• 解决了可能阻止文件在覆盖率报告视图中展开的问题。 (44458167)
• 如果测试包在测试过程中由于某种原因(例如运行时链接失败)无法加载,Xcode 现在会报告一条描述性错误消息,描述失败的原因。 如果您使用 xcodebuild,则此失败信息存在于测试活动日志中并显示在 stdout 中。 结果包中包含的结构化日志中也存在该错误。 (45242409)
• 如果测试因测试运行程序在启动时崩溃而失败,Xcode 会尝试生成描述失败的详细错误消息。 如果您使用 xcodebuild,则此失败存在于测试活动日志中并显示在标准输出中。 结果包中包含的结构化日志中也存在该错误。 (29148418)
• 如果 xcodebuild 在测试运行时被 SIGINT 信号终止,则会将有效结果包写入磁盘并包含终止前完成的测试结果。 同样,如果您取消在 Xcode 中运行测试,将生成一个有效的结果包,其中包含已完成的测试的结果。 (45022325)
• xcodebuild 或Xcode 的第二个实例不会删除并行分布式测试期间创建的模拟器副本。 (40738122)
• 解决了可能导致多个目标中包含的文件代码覆盖率不正确的问题。 (40409346)
• 测试期间收集的崩溃报告不再遗漏终止原因和描述等重要字段。 (44405884)
• 未明确包含在目标的标头构建阶段中的标头不再出现在覆盖率报告的目标条目中。 这修复了目标的覆盖率报告中可能出现不需要的标头的问题 - 例如来自链接的框架或库的标头。 如果您发现覆盖率报告中缺少标头,请确保它们包含在相应目标的标头构建阶段中。 (36187447)
• 具有多个测试目标的项目(每个目标都包含一个从共享XCTestCase 子类继承的测试类)不再显示来自不存在的其他目标的运行时(“rT”)测试。 (46042417)