Tag: 编译

跟踪Swift编译时间

通常,您需要向财务部门证明如何为您提供新的笔记本电脑会提高生产率。 使用此脚本,您可以确切地向他们显示等待Xcode花费时间的时间。 #!/bin/bash 让我们开始一个新的BASH脚本。 在脚本的整个生命周期中,它应大约运行swiftc (Swift编译器)运行的时间,并应与Xcode项目完全脱钩。 当我们在这里时,让我们获得其他一些有趣的统计信息,例如最长的构建时间和我们编译代码的次数。 首先,我们需要声明我们的变量。 让我们在脚本顶部编写该代码,以便在需要时可以轻松地对其进行编辑: INTERVAL = 5#采样率,以秒为单位 COMPILE_TIME = 0#总编译时间 ALL_TIMES =()#所有编译时间的数组 PREV_TIME = 0#临时存储 在这个阶段,我正在想象该脚本没有自然的退出点-它会一直运行,直到您从终端用^C (control + c)杀死它为止。 我们应该截获(也就是“捕获”)此中断信号,处理我们收集的数据,打印它,然后退出脚本: #当用户键入^ C时, #运行函数ctrl_c而不是退出 陷阱ctrl_c INT 函数ctrl_c(){ #找到最长的构建时间 最大= 0 对于$ {ALL_TIMES [@]}中的v; 做 如果(($ v> $ max)); 然后max = $ v; fi; 完成 #很好地格式化我们的数据 TIME_SPENT_S = $(日期-u -r $ max […]

Xamarin.iOS构建选项

Xamarin IDE为iOS和Android提供了非常有用的构建选项。在这里,我们讨论可用于iOS的构建选项。 可以使用各种配置和平台进行配置。 在这里,我仅考虑将其用于两种配置和平台,但是您可以根据自己的选择进行配置。 我在这里考虑的配置是Debug and Release,而Platform是模拟器和Device。 注意:有些构建选项对于调试配置是不可选择的。 什么是构建选项,它的用途是什么? 构建选项是在构建应用程序时可以使用的预定义规则或配置,换句话说,我们可以称其为构建应用程序时可以应用的一组规则。 它用于减少构建时间,应用程序大小,提高应用程序性能等。 如何打开Xamarin.iOS应用程序的构建选项? 您可以通过双击iOS项目来打开构建选项,或者右键单击它,在Mac的Visual Studio中选择“选项”,在Windows的Visual Studio中选择“属性”,然后从左侧面板中选择iOS生成选项。 您可以更改每个可用配置和平台的构建选项。 有关如何更改和添加构建配置和平台的更多详细信息,请检查:https://blog.xamarin.com/demystifying-build-configurations/ 有关配置和平台选项,请参见附图(Visual Studio for Mac的屏幕截图)。 了解构建选项 如上图所示,有许多可用的构建选项,每个都有不同的用法和优点,其中一些可能在某些配置和平台上不可用。 SDK选项:这使您可以选择系统上安装的iOS SDK版本,以用于构建应用。 链接器行为:在构建应用程序时,Visual Studio for Mac或Visual Studio会调用一个名为mtouch的工具,该工具包括托管代码的链接器。 链接器可以删除未使用的代码,以减少应用程序的整体大小。 链接器使用静态分析来确定您的应用程序易于遵循的不同代码路径。 这是一个繁重的过程,因此在编译时会花费一些时间,因为它必须遍历每个程序集的每个细节,以确保不会删除任何可发现的东西。 可以通过从可用选项中选择选项来定制链接器行为。 Xamarin提供的主要三个选项如下所述。 不链接:选择此选项意味着链接步骤将被跳过,并且不会删除任何代码。 这样可以加快构建过程,但会产生较大的IPA。 在构建应用程序时使用它是有意义的,因为作为开发人员,您关心的是减少构建应用程序的时间 仅限于Link Framework SDK:此选项将使您当前的应用程序程序集保持不变,并通过删除应用程序未使用的所有内容来减小Xamarin.iOS(Xamarin.iOS SDK)附带的程序集的大小。 当您将平台定位到iOS设备时,此选项最适合。 此选项与“全部链接”选项的区别在于它无法执行少量优化。 全部链接:设置此模式时,链接程序可以使用其优化的整个集合来尽可能减少应用程序。 它将同时对用户代码执行链接操作,从而修改用户代码,因此,当您的代码使用某种功能(链接程序的静态分析无法检测到)(对于Web服务,反射或序列化)时,它有时可能会中断。 可能需要对代码进行一些更改才能使应用程序链接所有内容。 您可以从此处找到有关链接和链接器安全代码的更多详细信息:https://developer.xamarin.com/guides/ios/advanced_topics/linker/ 支持的体系结构:此选项指定可以在哪些设备上运行应用程序。 根据处理器体系结构,它具有许多选项。 下面列出了每个设备名称。 ARMv7 – iPhone 3GS,4、4s。 […]

iOS最喜欢的框架:使用R.swift的Typesafe

Android IDE在构建时自动生成一个R.java文件,该文件包含项目中每种资源类型的子类以及对其的静态引用。 例如,R.drawable.icon将是名为“ icon”的图像的ID。 在iOS中,我们不太幸运-加载资源文件需要我们指定其名称,例如:UIImage(named:“ icon”)。 这可能会导致一些问题: 不必要的强制转换-例如:使用标识符使可重用单元出队将导致UICollectionView类型的实例,但是在运行时,我们大多数情况下将有一个继承自UICollectionView的实例。 如果我们知道该单元格的标识符,那么我们就知道该单元格的类型。 由于错误的字符串标识符,导致运行时崩溃。 没有自动完成。 R.swift是一个模仿Android IDE R.java文件创建的框架:我们添加了一个在构建时生成R.swift文件的脚本。 该文件包含对项目中所有资源的静态引用,例如: 图片 字型 资源文件 色彩 本地化字符串 故事板 塞格斯 笔尖 可重复使用的细胞 因此,例如,看下面的行: 让图像:UIImage = UIImage(名称:“ imageName”)! 如果文件imageName不存在,它将崩溃(强制解开nil)。 相反,我们可以使用以下行: 让图像:UIImage = R.image.imageName()! 如果imageName文件更改了它的名称或从项目中删除了它,我们将收到一个编译错误! R.swift对我来说是必不可少的框架-没有它,我就不会开始一个项目! 我建议您转到它的GitHub存储库并检查文档中的其余示例。 快乐(安全)的编码🙂

带有存根示例的自定义Xcode构建配置

您可能已经看到Xcode创建新项目时,有两种构建配置:Debug和Release。 在本文中,我们将学习如何使用网络存根示例创建自定义构建配置,以演示如何进行设置以及其工作方式。 最近,我们正在一个项目上进行工作,其中我们有一个网络层来向我们的服务器发出请求,并在它上面的一个服务层来接收响应,并且在大多数情况下都会发生业务逻辑。 在这种情况下,为了同时测试网络层和服务层的业务,我们使用模拟数据对测试请求进行存根。 我们可以通过多种方法来执行此操作,包括将参数传递给网络对象的运行时检查,然后在运行时进行条件检查,以确定是否应该对响应进行存根。 我们将从Debug配置中创建一个新的。 现在我们有了定制的构建配置,下一步是设置编译器标志,以便我们可以进行标志检查。 我们仅搜索活动编译条件并添加了TEST标志。 对dd来说,在Project和Target上使用此标志非常重要。 现在我们有了一个新的构建配置,我们可以将其设置为将用于该项目上每个目标的每个动作的配置。 添加标记后,我们现在需要在“测试”操作上编辑架构,并更改它将使用的构建配置。 只需为“测试”操作选择“测试”构建配置,即可完成。 现在,我们的测试目标将使用“测试”配置来构建。 现在,让我们看看它如何在我们的示例中运行: 这就是全部,希望您喜欢🙂 如果我有问题或您有任何意见或疑问,请告诉我。 我很高兴收到您的反馈feedback 您可以在Twitter上@ LucianoPassos11找到我。 感谢您阅读🙂

如何通过运行时检查来加强代码?

在某些发生运行时类型检查的情况下,无法进行编译时类型检查。 就像从网络上读取数据(当时源代码不知道数据)一样,从用户那里获取输入不满足要求以及由于算术运算等导致的溢出问题。 Swift提供断言来意识到这些问题。 在深入研究Assertions之前,让我们看一下新引入的Swift编译模式和Swift优化级别。 调试构建:增量-Swift支持增量构建目标,即,在更改单个文件时,不重建目标中的每个Swift源文件。 依赖于已修改文件的每个文件都将被重建。 发布版本:整个模块-此选项一起优化目标中整个模块的所有文件,并提高性能。 它可以执行函数内联和函数专业化等优化。 Swift提供了四种不同的优化级别: -Onone :基本上用于常规开发,即调试版本。 它执行最少的优化,并保留所有调试信息。 建议始终在此模式下使用增量编译。 -O :这用于生产代码。 编译器执行了激进的优化,可以极大地改变发出代码的类型和数量。 调试信息将被发出,但是会造成损失。 -Ounchecked :这是一种特殊的优化模式,适用于愿意为性能而牺牲安全性的特定库或应用程序。 编译器将删除所有溢出检查以及一些隐式类型检查。 通常不打算使用此方法,因为它可能导致未检测到的内存安全问题和整数溢出。 仅当您仔细检查了代码对于整数溢出和类型强制转换是安全的后,才应使用它。 -Osize :这是一种特殊的优化模式,在该模式下,编译器将代码大小优先于性能。 此模式适用于整个模块以及单文件编译,而整个模块模式可提供最佳的优化结果。 注意:可以在项目的构建设置中设置优化级别和编译模式。 每当我们需要根据预期的条件检查代码时,就可以使用断言,并且将引发异常。 标准Swift库带有五个断言函数: 断言(_:_:file:line 🙂 assertionFailure(_:file:line 🙂 前提条件(_:_:file:line 🙂 preconditionFailure(_:file:line 🙂 fatalError(_:file:line 🙂 让我们详细研究每个功能: assert():此方法类似于传统的C样式断言,带有可选消息。 它仅应用于在测试过程中处于活动状态但不会影响运输代码性能的内部完整性检查。 如果condition评估为false ,则在打印message后以可调试状态停止程序执行。 示例:对于要入学的孩子,最低年龄要求为3岁,因此我们可以在此处检查此情况: 注意:“ **”优化器可能会假定从未调用此函数。 https://swift.org/blog/whole-module-optimizations/ https://swift.org/blog/osize/ https://developer.apple.com/documentation/swift/swift_standard_library/debugging_and_reflection 采用断言是一个好习惯。 您应该注意使用正确的功能进行适当的构建。 一个小错误可能会导致生产应用程序崩溃,从而影响最终用户。 感谢您的阅读,我们期待您的反馈。 您可以在以下位置找到我: Linkedin个人资料: […]