Tag: xcode

迅捷代码段#14 — UIAlertControllerStyle

您可以在这里找到其要点! UIAlertControllerStyle 第一个扩展位于UIAlertControllerStyle ,它返回特定样式的UIAlertController实例,即– alert或actionSheet 。 所以现在我可以做这样的事情, 让alertController = UIAlertControllerStyle 。警报 .controller(title :, message :, actions 🙂 因此,我现在可以要求一个特定样式的控制器(而不是在UIAlertController的构造函数中传递样式类型) (如果您已阅读以前的摘录或博客文章,现在您可能已经知道我喜欢面向扩展的apis –更加简洁易读)。 串 现在,任何警报还将具有与之关联的一些操作。 因此,下一个扩展名是String因为每个动作都将具有标题,并且它返回UIAlertAction的实例, 让dismissAction =“ Dismiss” .alertAction() let retryAction =“ Retry” .alertAction {/ *中的_重试逻辑* /} 因此,我现在可以要求在String上使用UIAlertAction ,而不是将标题传递给UIAlertAction的构造函数。 就是这样,现在让我们看一下整个api, 无需创建额外的类,我们已经能够编写如此短的api来构造任何类型的UIAlertController 。 您还可以使用相同的api制作actionSheet。 PS –为了简化起见,我使用了String ,但是如果您不喜欢它,则还可以为不同的动作创建一个Enum并将其扩展为具有类似的行为! 如果您对 Swift-Snippets 的诞生感到疑惑, 或者想查看更多此类片段,可以在 这里 找到它们 😊

Swift Enum kullanarak daha组织listeleroluşturmak

UITableView 和 UICollectionView kullanırkenfarklısection’larıkurgulamak ve kodlamak她的zamankarmaşıkolmuştur。 您可以通过以下方式获取更多信息:“部分”列表中的“部分”部分,例如“部分”部分。 Buyazımdaswift enum kullanarak bu zorluklar ile engüvenliyoldannasılbaşaçıkabileceğimizdenbahsedeceğim。 Nedenkarmaşıkolsun ki吗? Diyelim ki birüründetayekranıtasarlıyoruz。 Enüstteürünresimlerininbulunduğubölüm,altındafiyat bilgisi,altındailgiliürüniçinkullanıcıaksiyonları,altındaüründetayları,altındabenzeryüylerderken uz Bukadarıyetmezmişgibibazıkullanıcılarabenzerürünlergösterilmesin,bazılarındaise aksiyonlar enüstsıradagözüksüngibi fantastik istekler mevcut。 İstanbulkarmaşıklıkburadabaşlıyor。 请使用UITableView和UICollectionView代表数据源,方法是将列表中的索引添加到索引中。 继续前进,从左到右依次是列表列表,列表列表,列表列表,列表列表,列表列表和列表列表。 Enumartıkdaha yetenekli Enum’lar genellikle kodokunabilirliğiniarttırmak,技巧güvenliğinisağlamakgibigerekçelerilebirçokprogramlama dilindekullanılır。 苹果迅捷的双向灌肠器tanımlamalarınıgeliştirdiveartıkenum’larüzerindebellideğerlertutabilme ve method yazabilmeolanaklarımızmevcut。 可以说是枚举,它的名称是alanyaratılmışoldu。 购买UITableView和UICollectionView列表中的列表。 哈迪·巴斯拉勒姆(HadiBaşlayalım) Mademöyle,类似的商店,您可以在此预订。 Benörnekolarak biraraçdetayekranıtasarlamaya karar verdim。 Listeleme双语UITableView kullanacağızve ilk olarak section’lariçinenumoluşturarakbaşlayayabiliriz。 枚举TableSection […]

在您的React Native应用中获取Xcode版本号

如果您出于任何原因希望能够在应用程序中显示版本号,我将向您展示如何在React Native iOS应用程序中实现该版本号。 步骤1: 使用react-native init versionApp创建一个新的react native项目 第2步: 编辑AppDelegate.m文件并添加以下代码行 //创建版本变量并创建props对象 NSString * version = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@“ CFBundleShortVersionString”]; NSDictionary * initialProps = @ {@“ version”:version}; 第三步 : 将创建的props对象传递到同一AppDelegate.m文件中的initialProperties中。 默认情况下,为零。 之前 : RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@“ VersionApp” initialProperties:nil //更改此行并传入新的props对象 launchOptions:launchOptions]; 之后 : RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@“ […]

如何从Git存储库构建iOS应用程序(FOR QA STAFF)

这是给质量检查人员或测试人员的说明,说明如何从Git(GitHub)存储库在设备上构建iOS应用程序。 在本文中,我假设以下内容: 该读者(以下称“您”)不是iOS应用程序开发人员 您应该在Apple设备上检查团队申请 您有您的Apple帐户 您可以要求团队管理员邀请您加入团队项目 您可以访问并将Git(GitHub)存储库克隆到您的计算机中 您的项目进度非常紧张,您没有时间采取其他理想的方式(例如,由TestFlight或DeployGate提供) 除上述内容外,这些经验或知识还可以帮助您: 通过ADB命令在设备上安装Android apk 使用任何IDE 脚步 将您的Apple帐户注册到开发者帐户 要求您的团队管理员邀请您成为会员 安装Xcode 使用Xcode克隆您的团队存储库 在Xcode上设置您的Apple帐户 将Apple设备连接到计算机并构建项目 1.将您的Apple帐户注册到开发者帐户 首先,您应该获得您的Apple Developer帐户。 您可以将Apple帐户注册为Apple Developer帐户。 2.要求您的团队管理员邀请您成为会员 接下来,您应该要求团队开发人员邀请您成为Apple开发人员[人员]的成员。 在他(她)将您的(苹果)开发人员电子邮件地址添加到项目中之后,您将收到邀请电子邮件。 3.安装Xcode 下载并安装Xcode。 如果您不需要使用Xcode Beta,则可以从App Store获取(正常)Xcode。 4.使用Xcode克隆您的团队资源库 首次启动Xcode时,Xcode将显示如下视图。 单击“克隆现有项目”后 ,Xcode将打开新窗口。 键入Git存储库的URL后,您可以获得源文件并打开项目。 5.在Xcode上设置您的Apple帐户 现在,您可以使用Xcode打开您的团队项目,但可能会有一些警报。 通过单击左窗格顶部的左文件夹图标,打开项目目录。 您可以通过单击“添加帐户…”打开“帐户”视图,然后键入您的Apple(开发人员)ID。 然后,警报将被删除。 6.将Apple设备连接到计算机并构建您的项目 现在,您可以在预设的模拟器或真实的Apple设备上运行项目。 将设备连接到计算机并选择它,然后单击三角形(播放?运行?)图标。 (您可以知道在中心框上构建的进度。) 之后,您可以通过git-pull构建并尝试最新的源代码。 (就我而言,我使用GitHub Desktop控制存储库。尝试您熟悉的方式。) 例如 获取运行日志 您可以使用Xcode读取设备上运行的应用程序的日志文件。 打开工具栏上的“ 窗口”>“设备 ”,然后单击“ […]

每个iOS开发人员都应使用的10个开发工具

这是我在Medium上的第一篇博客文章,我想将其专门用于开发工具,这些工具可以节省很多宝贵的时间,从而使我们(至少是我的)生活更加轻松。 对我来说,在项目上工作时最重要的是要提高生产力,并且要实现这一点,我必须找到并使用能够帮助我花更多时间并专注于实际应用功能及其复杂性的工具。 直截了当,这里是我每天使用的工具: JSON Accelerator –一种在Objective C中处理JSON数据的更好方法。当处理JSON并创建各自的模型时,这变得很痛苦。 JSON Accelerator将遵循SOLID原则自动创建模型。 就我个人而言,这是我无法缺少的工具。 它会在不到一秒钟的时间内为所提供的JSON数据生成所需的文件,而不会花费数小时手动创建它们。 不幸的是,它仅支持Objective-C,因此对于Swift,我正在使用SwiftyJSONAccelerator来完成相同的工作。 Prepo –准备,共享和预览App图稿和图标。 拖放图稿以将@ 3x和@ 2x快速转换为@ 1x,并在上下文中预览Icon图稿。 Prepo将所有图稿存储到项目窗口中,以准备批量导出,或将QuickDrop用于@ 3x和@ 2x的超快速大小调整。 您是否曾经从设计师/客户那里收到过一种尺寸不正确且命名错误的资产? 好吧,它经常发生,它们会让您处理其余的事情……该工具可以帮助您解决这种情况,因为它将所有资产转换为所需的大小,并为您正确命名。 它还可以将您的应用程序图标转换为所有所需的大小。 CocoaControls –是一个了不起的网站,您可以在其中找到超过5000个Swift和Objective-C开源GitHub库。 因此,下一次,而不是四处寻找应用程序所需的一些UI组件,只需访问该站点,您将找到所需的一切。 Postman –是一款用于与HTTP API进行交互的Google Chrome应用。 它为您提供了一个友好的GUI,用于构造请求和读取响应。 我的实践是在项目中实现API之前先构建和测试它们。 它拥有超过300万用户。 CocoaPods –是Swift和Objective-C Cocoa项目的依赖项管理器。 它拥有超过32,000个库,并在超过210万个应用程序中使用。 CocoaPods可以帮助您优雅地扩展项目。 我必须在我从事的每个项目中都包含的另一种工具…除了在整个项目中保留外部库并在添加它们之后遇到各种问题之外,您还可以使用CocoaPods以一种优雅的方式解决所有问题,并将所有内容都保存在一个地方一些终端命令行。 JSON Formatter –您是否曾经收到没有格式的JSON响应,而您几乎无法理解其结构? 这就是为什么我开始使用此Google Chrome扩展程序的原因,并且浏览器中的JSON响应不再出现视觉问题。 我建议您也这样做,并且保证您会喜欢自动格式化的回复。 Sympli –与Photoshop,Sketch,Android Studio和Xcode合作的团队的设计移交和实施。 我必须说,对于一个可加快您的UI实施速度的插件而言,这是一个非常有趣的概念。 这就是它的工作原理……创建一个项目,然后设计师从Web版本添加他的文件,然后转到Xcode项目并安装插件,只需按一下按钮,它将在UIViewController和还为组件创建所需的插座。 这个插件没有太多经验,但是我鼓励您尝试一下并分享您的印象。 我还将分享一些未在开发中直接使用的工具,但它们也是重要的一部分: SearchMan –如果您在AppStore上拥有自己的应用程序,并且想跟踪您的关键字排名和应用程序的可见性,则可以使用此免费的ASO工具,该工具将为您提供有关应用程序位置的见解。 […]

一种大幅减少iOS应用程序下载量的快速方法

在阅读本文之前:Apple表示将通过不同的“打包”方式将所有应用程序的下载大小减少50%。 他们可能正在解决本文提供的解决方法的问题,从而使本文无关紧要。 但是,我将把这篇文章留给大家关注。 应用下载大小很重要。 应用程序的下载大小越大,用户下载的用户就越少。 此外,如果超过150 MB,则App Store将不允许用户通过WWAN下载它。 什么决定了应用程序的下载大小? 让我们看一下Telegram应用程序(为iPhone X精简),看看每种文件类型贡献了多少: 如您所见,它由二进制文件(主要的二进制文件,框架和扩展二进制文件)主导。 二进制文件通常占应用程序下载大小的60%以上。 为什么我的二进制文件这么大? 真的有那么多代码吗? 猜猜是因为我是10倍程序员😏 代码当然可以加起来,但是部分问题在于,Apple在将二进制文件的大部分添加到用户下载的压缩有效载荷之前对其进行了加密。 加密数据在压缩程序中看起来像随机数据,因此它根本无法对其进行压缩。 但是加密是好的,因为它会使我的应用程序更防篡改,对吗? 实际上,加密几乎没有用! 您可以借助Clutch轻松地在越狱的手机上解密任何应用程序。 另外,防篡改对您的应用程序有多重要? 加密增加了多少? 对于典型的应用程序,加密部分约占二进制文件的70%(而二进制文件又占应用程序的80%)。 如果未加密然后再压缩,则其大小将减少约60%。 因此,我们拥有60%的80%中的70%,即将您的应用程序总体大小减少了34% 。 您可以使用此脚本来估算节省的费用。 您可以在下面的“ iOS二进制文件概述”部分中找到有关加密内容的更多详细信息。 结论:您的用户正在下载大量的应用程序有效负载,毫无收获! 解决方案:将所有内容移出二进制文件的加密部分 iOS二进制文件概述 每个二进制文件都组织成许多称为段的块。 每个段均包含多个部分。 这里有一段代码,一段是常量字符串,等等。Apple加密__TEXT段,仅此而已。 如果我们将所有部分移出该段,则该段将几乎不占用空间,并且对其进行加密不会对我们的应用产生太大影响。 可以将这些部分移到新的段,在这些段中它们不会被加密并且可以正确压缩。 我们应用的解压缩大小不会改变,但压缩大小会改变。 为什么不完全摆脱__TEXT ? 可能有一种方法可以完成,但是当我尝试时,我遇到了许多问题,因此我们只介绍这些部分。 1.禁用位码(如果已启用) 我们的链接器标志不适用于位码,因此我们必须关闭位码。 关闭位码有什么缺点吗? 我认为,不是真的,但是想要了解更多信息,请通读本文。 另外,如果您决定要在以后的发行中使用位码,则始终可以撤消该技巧。 2.检查您应用的当前状态 从构建日志获取可执行文件的路径: 然后,运行xcrun size -x -l -m ,您应该获得: […]

为什么需要在2018年将移动DevOps保留在内部

最初发布在XCBlog网站上 ,请阅读原始博客以获得更好的图形! 信不信由你,建立和管理DevOps工具是一项令人费解的活动。 对于Web和移动应用程序开发都是如此。 它需要对服务器和网络技术,具有复杂脚本的自动化,云技术和24 x 7监控支持的深刻理解。 这使许多企业家,项目或计划经理感到头疼,以至于许多人选择将此流程完全外包给其他公司或使用基于云的提供商来处理。 DevOps活动成为Web和移动应用程序开发中的大人物。 应用程序开发人员不具备处理DevOps工具的技能,并且拥有专门的DevOps团队对于企业而言过于昂贵,因为它不会直接产生业务收入。 在这篇文章中,我们将看到为什么您急需在2018年考虑内部移动DevOps。是的,在2018年,因为您可能会受到新年开始时Apple购买的BuddyBuild的影响。 希望在本文结尾处,您将看到使用内部移动DevOps的一些好处 那么DevOps到底是什么呢? 那是一百万美元的问题,简称为“没人知道”,也就是说,DevOps在任何地方都没有具体定义。 关于DevOps的说法有很多。 有人说这是一套工具,这是新的开发方法,是管理CI / CD的团队,是职务或职位,但没有一个是正确的。 我对DevOps的理解非常简单,无论是接受还是抛出,但是我对DevOps的定义是 “您为加快免费软件发布的速度而采取的一切操守都被视为DevOps” DevOps庞大,有数百万篇博客文章,数千篇白皮书,数百本书籍,并且有新颖的作品来解释DevOps的概念。 OMG有一个名为“凤凰计划:有关IT,DevOps和帮助您的业务成功的小说”的小说,这个名字很长,但是它包含了DevOps的细节。 我强烈建议所有想要了解DevOps的人员使用此工具。无需遵循针对DevOps实践的预定义流程,技术或工具,但是,DevOps在小说中提到了三个应该遵循的支柱,即系统思考,放大反馈循环,持续实验和学习。 开发网站和手机应用程序是两项完全不同的活动。 它们在技术,基础架构,流程,工具和技能方面各不相同,因此很难将两者融合在一起。 结果,用于Web和移动设备的DevOps实践或工具也有所不同。 管理Web和DevOps的技术和过程可以相同,但是工具上存在一些主要差异。 我们将在这里介绍5个基本差异 浏览器与设备 Web应用程序必须支持各种桌面/移动操作系统和浏览器,而移动应用程序必须支持具有多种变体的特定于平台的移动操作系统。 移动应用程序的各种环境目标。 移动必须支持多种变体。 例如,iOS在iPhone,iPhone +和iPad变体上具有各种iOS版本。 App Store与托管服务器 移动应用一旦发布,便托管在AppStore或Play商店中,但是Web应用需要在数据中心或云中托管服务器。 如今,大多数Web应用程序都托管在AWS,Azure或类似的云中。 Web应用程序始终需要操作和监视,但是移动应用程序不需要监视托管,因为AppStore或PlayStore将负责托管。 拉与推部署 Web应用程序始终具有推送部署,这意味着可以按需部署新版本的网站,并且用户无法选择接受或拒绝更新。 但是,移动应用程序具有拉式部署,除非强制执行,否则用户可以选择是否更新到新版本。 如果发布移动应用程序,则不会回滚。 另一件事是,在移动世界中没有持续的部署,因为苹果或谷歌必须在发布新版本的应用程序之前等待几天才能批准应用程序。 移动应用程序的发布比Web应用程序的风险更大。 技术领域 用于开发Web和移动应用程序的工具和技术存在主要差异。 用于移动原生开发的编程语言是Swift,iOS和Java的Objective-C或Android的Kotlin。 还有其他一些混合框架可用于一起开发Web和移动。 但是,可以使用数百万种编程语言(例如Java,Ruby,PHP,Python,JavaScript等)来开发Web应用程序。平台之间的持续集成工具也相差很大。 例如,詹金斯(Jenkins)是一种非常流行的工具,可以将Web应用程序部署到任何地方,但是对于移动持续集成而言,它并不总是一个好的选择。 后端服务 不幸的是,不可能将所有必需的数据放入应用程序中,因此Web和移动应用程序都依赖某种向其提供数据的后端服务或API。 这些服务可能设计也可能不设计为同时服务于Web和移动应用程序,因此找出后端服务中的任何更改可能会影响到移动应用程序或Web应用程序或两者都必不可少。 移动应用程序也需要单独注意。 […]

清洁架构:Swift中的网络

我们所有人都在朝着iOS的干净架构迈进,为此,我们一直在尝试许多方法,例如:从MVC迁移到MVVM,以使我们的视图模型独立且易于测试。 诸如Viper和MVVM-C之类的更多模式也已经出现,并被开发人员广泛采用。 在本教程中,我们将看到如何使用Restofire编写干净的网络请求。 Restofire是在Alamofire之上编写的面向协议的网络抽象层, 用于以声明方式使用服务 我们将使用来自apiary.io的Notes API — https://rahulkatariya.docs.apiary.io/ 分解cURL请求 主持人 private-07c21-rahulkatariya.apiary-mock.com 标头 – Content-Type: application/json 路径 – notes 响应 — NoteResponseModel的集合 配置Restofire的最佳位置是在didFinishLaunchingWithOptions内部。 设置主机和标头后,它将应用于我们使用Restofire发出的所有网络请求。 您可以全局提供更多配置,例如请求超时,重试代码,重试间隔,最大重试次数,验证,身份验证等。 默认情况下,所有网络响应的类型都是Data但是我们可以根据需要设置自定义响应序列化器。 对于此演示,我们将通过在应用程序内部添加以下代码段来使用JSONDecodableResponseSerializer 。 通过添加以上代码,我们现在可以将可解码类型用作请求的响应。 让我们为Note响应创建一个可解码的模型。 在Restofire中,每个HTTP请求都是独立的,并由Requestable协议表示,并提供委托方法来处理响应。 委托方法可用于将响应保存在CoreData或Realm或UserDefaults内部,或者您可以执行任何自定义操作。 让我们创建第一个网络请求以获取所有注释。 我们已经在AppDelegate全局配置了host和headers 。 让我们创建NotesGetAllService服务,其path as ” notes ” , response as [NoteResponseModel] 您可能已经注意到,我已经通过侦听响应回调(如下面的代码)在可CoreData内部传递了NSManagedObjectContext ,以将响应结果存储在CoreData中。 现在, NotesGetAllService非常灵活,可以在我们的代码中的任何地方调用,并将响应存储在CoreData中。 在AppDelegate设置CoreData之后,我们现在可以请求获取所有注释。 execute方法是Requestable协议的默认实现,该协议发出请求并调用NotesGetAllService的委托方法。 注意:如果您希望响应也随调用一起传递,则还可以在execute方法内传递完成处理程序。 请求完成后,它将保存在CoreData中的注释列表,并且与FRC绑定的NotesTableViewController将自动显示结果。 可以在此处找到功能齐全的演示,包括本文随附的NotePostService和NoteDeleteService -https://github.com/Restofire/RestofireDemo 快乐网络😎 […]

有关代码编辑和导航的一些很棒的Xcode技巧

尽管Xcode不如Eclipse或IntelliJ强大,但它具有许多功能,可以大大改善我们的编码寿命。 这篇文章重点介绍一些使代码编辑和导航更快,更轻松的技巧。 快速打开 通过输入⌘⇧OXcode,可以显示一个类似 (多次说)的焦点视图,该视图使您可以按文件名或该文件中定义的符号名快速查找文件。 您甚至可以键入要查找的全文或部分全文。 搜索结果将适应您输入的文本量。 搜索范围仅限于当前项目和SDK。 在项目导航器中显示打开的文件 很多时候,在编辑器区域中当前打开的文件在Project Navigator(显示文件层次结构的左窗格)中不可见。 您可以从编辑器中打开的文件的上下文菜单中手动搜索文件或使用“在项目浏览器中显示”选项。 如果您不喜欢单击右键,也可以键入此快捷方式⌘⇧J以完成相同的任务。 跳到特定行 当您要跳转到的特定行时,可以键入⌘L ,然后键入要跳转到的行。 当您执行代码检查并通过差异中的行号定位代码时,这非常有用。 自动缩进选择 Xcode具有较差的代码格式设置功能。 我经常使用的最有用的功能是自动缩进功能。 我通过选择一些代码并输入⌘I来使用它。 这只会缩进选定的文本。 当存在块,lambda和嵌入代码时,此快捷方式非常有用。 生成存根文档注释 VVDocumenter Xcode插件会自动生成存根字典注释。 在函数上方输入三个斜杠///或将生成任何神奇的注释。 onevcat / VVDocumenter-Xcode VVDocumenter-Xcode – Xcode插件,可帮助您为Objective-C和Swift轻松编写文档注释。 github.com 注释和取消注释代码 注释和取消注释代码再简单不过了。 选择未注释的代码,然后输入⌘/对其进行注释。 选择注释的代码,然后输入⌘/取消注释。 我告诉你这很容易:)。 突出显示当前行 背光插件高亮显示当前行 柠檬软糖/ XCode背光 XCode背光–突出显示Xcode github.com中的当前编辑行 合成 快速打开: ⌘⇧O +查询+输入 在Project Navigator中显示: ⌘⇧J在编辑器中的文件上 跳到一行: ⌘L +行号+输入 […]

未定义的行为消毒剂

在最近的文章“有关Thread Sanitizer的一些知识”中,我们讨论了Thread Sanitizer工具及其工作方式。 如果您仍然没有阅读它,建议您在开始阅读本指南之前先阅读它,以了解一些概念和参考。 在今天的文章中,我们将讨论Undefined Behavior Sanitizer或UBSan。 所以……让我们从问题开始: 什么是UBSan? 摘自Apple未定义的行为消毒器文档 Undefined Behavior Sanitizer或UBSan是用于C语言的LLVM工具,可在运行时检测未定义的行为。 未定义行为描述了具有未指定语义的任何操作的结果,例如除以零,从未对齐的指针加载内存或取消引用空指针。 UBSan可以检测到许多其他未定义的行为,例如对数组的越界访问,整数溢出,对浮点类型与其他类型之间或从它们之间的强制类型转换。 未定义行为是最难调试的错误之一,因为您永远不知道它是否会导致崩溃,或者只是从丢失的指针数据中返回垃圾数据,或者如果您很幸运,它可能就好像没有什么问题一样起作用。 怎么运行的 让我们使用一个简单的C代码示例 如您所见,结果似乎有点不可思议吧? 由于32位MAX_INT的值为2147483647,为什么结果等于INT_MIN? 那是因为二进制加法的方式。 但更重要的是,这不是运行时错误,而只是显示“错误”的输出。 现在让我们看看启用USan的工作方式 要使用UBSan进行编译,我们只需传递-fsanitize = undefined标志 clang ubsan.c -o ubsan -fsanitize =未定义 OBS:您可以启用UBSan进行特定检查。 例如,仅检查整数溢出,将标志更改为-fsanitize = signed-integer-overflow。 有关更多信息:启用未定义的行为清理器 现在,UBSan检测整数溢出错误并显示为输出。 太酷了\ o / XCode上的UBSan 在Xcode上设置UBSan非常简单。 让我们建立一个Objective-C项目,看看它如何工作。 首先,我们必须启用UBSan: 在“产品”>“方案”>“编辑方案”上,在“运行”操作的“诊断”部分中,只需选中“未定义行为消毒剂”。 因此,建立一个项目,从前放置相同的代码,启用UBSan并在Xcode上运行该项目,将给我们带来运行时错误,如下所示: 重要 Apple Core Diagnostics文档中的一件重要事情 Undefined Behavior Sanitizer对性能的影响很小,在Debug配置中平均有20%的CPU开销。 与TSan不同,UBSan对性能的影响最小,并且可以在设备上运行。 […]