迅速。无主相对于弱者的(绝对)唯一的具体优势是性能吗?

2023-11-27

在 Swift 中,我们有正常的默认类型

  • 该对象根本不能变为零。

我们有弱类型

  • 该对象可以变为零。如果对象变成nil,你的指针自动变成nil,所以你知道对象变成了nil

我们有无主打字

  • 该对象可以变为零。如果对象变成 nil,你的指针不会发生任何事情 - 如果你尝试使用它,你就完蛋了

(因此:推论:你可以使用“无主”的唯一一次是如果你“绝对知道”该对象永远不会变成零。)

现在:在我看来,下面这句话是绝对地真的……我的意思是,真的,真的,绝对,深入到最深层次的哲学问题 true...

“无主和弱之间的唯一区别是性能。由于无主没有检查,所以速度更快。绝对没有其他区别。”

因此逻辑推论:

“有,绝对地,没有理由使用 unowned,除非需要额外的性能超过弱。”

(旁白 - 我能想到的唯一的其他区别是在自我记录的意义上。如果我使用无主,它会提示我的开发人员同事注意某些事情;让我们搁置现在这个问题。)

所以我的问题很简单,非常准确,非常具体:上面的粗体句子是“true”(在“完全、非常、壮观”的真实意义上)。


我同意雅尼克的观点。你大胆的说法是不正确的。无主引用must终生有效。在一个-Ounchecked程序中,未能维持此前提条件是未定义的行为。我的意思不是“它崩溃了”。我的意思是这不是一个格式良好的程序;它的作用是未定义的。弱引用不能因其释放而产生未定义的行为,即使在-Ounchecked.

Using unowned是程序员声明该引用在其整个生命周期内有效。这根本就不算什么Type!断言。!类型只是断言引用在访问时有效。这就是为什么你无法测试x == nil在无主的。它不是可选的。它不是“变相可选”(比如Type!)。它必须始终有效。

然而,与弱引用不同的是,当另一个实例具有相同的寿命或更长的寿命。 ...无主引用预计总是有价值的. —— [Swift 编程语言]

因此,对于你的“最深层次的哲学”来说,无主包括一个弱者不存在的先决条件。这个前提条件存在于程序之外,并且必须由程序员而不是编译器来证明,以确保程序的格式良好。

是否有使用的理由unowned,如果我们采取绝对的立场(就像你的问题一样),那肯定是有的。在已知前提条件为真的情况下,它是最严格的类型。weak是比以下更弱的类型unowned;它表达的先决条件较少。好的类型理论鼓励我们尽可能使用最强的(最具限制性的;最少的法律价值)类型,并且unowned是比以下更强的类型weak.

从非绝对主义(“实用”)意义上来说,选择更强的类型的结果是更简单的代码。当你使用weak,你必须不断地重新断言它不是的前提nil每次你使用它并处理它所在的情况时(可能插入fatalError这只是重新发明unowned有更多的工作)。使用unowned让您断言此前提条件一次。这会创建更简单、更正确的代码。我从来没有用过unowned为了速度。我总是用它来避免一遍又一遍地回答“但是如果它为零怎么办?”在代码中它绝不能为零。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迅速。无主相对于弱者的(绝对)唯一的具体优势是性能吗? 的相关文章

  • NSPredicate 的 onFormat 字符串

    我想用 id 键对数据进行排序 我如何理解格式字符串的用途NSPredicate格式 我有一个100号的帖子 我的代码 let objectIDs posts map 0 id let predicate NSPredicate forma
  • 快速球体结合星数据

    我想构建一个观星应用程序 现在我已经构建了一个球体并用星图覆盖它 基于天体坐标 https svs gsfc nasa gov cgi bin details cgi aid 3895 https svs gsfc nasa gov cgi
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • 测试文本字段中的 double 是否有值

    尝试检查从文本字段获得的双变量是否有值 让值 双倍 Double valueTextfield text if value isEmpty X if 值 nil X 如果 值 0 X 我该怎么做呢 您可以使用 Double 的 init 方
  • Swift - 预期 '{' 启动 setter 定义

    我正在关注高级 swift WWDC 2014 视频 使用类上的下标来委托给类属性 但使用与视频中相同的语法时出现错误 enum Direction case North South East West class Place Thing
  • 如何在 Swift 中调用 Objective-C 实例类型方法?

    我有一个 Objective C 类 如下所示 interface CustomObjectHavingData NSObject property nonatomic strong NSData objWithData instancet
  • 斯威夫特/iOS。从导航堆栈中删除一些视图控制器

    这是我想做的 但我不确定这是否是正确的方法 所以请给我建议如何去做 我有初始 VC 和导航 VC 我从中推送第一个 VC 从中推送第二个 VC 接下来我介绍 来自第二个 VC 的 NavigationController 第三个 VC 现在
  • 删除 UINavigationBar 下的 1px 边框 - 不起作用

    IBOutlet var navBar UINavigationBar self navBar setBackgroundImage UIImage forBarMetrics UIBarMetrics Default self navBa
  • 我是唯一一个收到“当前目标框架中不可用的程序集”的人吗?

    在添加测试项目后 我在使用 Visual Studio 2010 和任何报告此错误的框架版本时遇到了一个持续存在的问题 当前目标框架中不提供程序集 到目前为止 我只在两个程序集上发生过这种情况 并且始终一致 系统服务流程 系统 配置 安装
  • Swift 中的字典是否应该转换为类或结构?

    我正在开发一个本机 iOS 应用程序 该应用程序从我们也可以控制的 Web 服务接收 JSON 格式的数据 该计划是在大约 18 个月内更换后端数据库 以支持不同的平台 考虑到这一点 我们希望确保 iOS 应用程序能够相对容易地适应新的数据
  • 如何使用 SwiftUI 创建自定义滑块?

    我可以使用 SwiftUI 创建滑块 但无法更改滑块的样式 如下图所示 问题 我无法在 SwiftUI 中找到任何选项来更改滑块样式 注意 我想仅使用 SwiftUI 创建它 我已经在 Swift 中使用 创建了这个滑块 https git
  • SKAudioNode 崩溃:AVAudioPlayerNode.mm:333:开始:所需条件为 false:_engine->IsRunning()

    我有一个简单的 SKAudioNode let backgroundSound SKAudioNode fileNamed backgroundSound mp3 我用来玩backgroundSound runAction SKAction
  • 在 swift 中发送自定义 HTTP 标头

    我设法从服务器获取 json 但现在我想通过 http 标头添加额外的安全性 这就是我的代码现在的样子 let urlPath http www xxxxxxxx com let url NSURL string urlPath let s
  • 为什么选择 & 符号作为 C++ 中的引用符号? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有谁知道为什么在 C 中选择 符号作为表示引用的方式吗 AFAIK 虽然我附近没有这本书 Stroustroup 没有解释这个选择 我觉得这有点
  • 快速检查网络速度

    我想从我的 swift 应用程序检查网络速度 我发现很多帖子描述了Reachability特别是查找连接是否可达以及是 WIFI 连接还是 WWAN 连接的方法 我的问题 是否可以检测 WWAN 的类型 2G 3G 4G 你可以用以下命令检
  • 我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

    在我的项目中 我将所有私有 swift 2 3 文件迁移到 swift 3 我想使用用 swift 2 3 编写的遗留框架 直到它们有 swift 3 版本 我尝试添加 使用旧版 Swift 版本 是 清除 构建我的项目 但我仍然遇到一些麻
  • Swift :基于 nsdate() 解析、查询日期字段

    我正在尝试检索今天添加的记录进行解析 但查询不返回任何结果 我怎样才能让查询返回基于今天日期的结果 let now NSDate var query PFQuery className userBids query whereKey dat
  • Visual Studio 参考在多项目环境中未被复制

    我在 VS 2010 中有一个解决方案文件 其中有多个项目 现在 我有一个对该 dll 调用 MySql Data Entity dll 的引用 例如 我在解决方案中设置了以下项目 域 引用MySql Data Entity dll Dom
  • C++ 内部如何存储引用? [复制]

    这个问题在这里已经有答案了 我只是想知道 引用是如何内部存储的 我觉得深入了解该级别将使我更好地理解指针与引用的概念并做出决策选择 我怀疑它的工作原理基本上与指针相同 但编译器负责处理指针 请指教 根本不要求以任何方式 存储 引用 就语言而
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代

随机推荐

  • 使用 JavaScript 打印多个 PDF 文件

    我想知道如何通过一次打印点击打印多个 PDF 文件 我可以轻松打印单个 PDF 文件 但当文件较多时我不知道如何打印 提前致谢 您可以致电print 在代码中多次出现 导致文件被一个接一个地打印 function PrintAll var
  • 为什么像“volatile int * p”这样的指向易失性的指针有用?

    volatile就是告诉编译器不要优化引用 这样每次读 写都不会使用寄存器中存储的值 而是进行真正的内存访问 我可以理解它对于某些普通变量很有用 但不明白如何volatile影响指针 volatile int p some addr int
  • 如何将 Bullet 物理应用于绘制的 Opengl 3d 形状

    我只是想知道是否有一种方法可以将子弹物理应用于 opengl 绘制的对象 使用 glVertex3f 或带有 glVertexAttribPointer 的三角形网格创建 我目前正在使用 jogl 和 jbullet 将物理应用到我的 3D
  • 尝试播放声音时出现“play() 失败,因为用户没有先与文档交互”错误 (javascript/html)

    我正在尝试使用 javascript 在网页上播放声音 但每当我这样做时 我都会收到上述错误 这是我的代码 if thing startsWith 0 var a new Audio audio mp4 a play 此外 如果您打开控制台
  • 如何设置 Elastic beanstalk Windows 应用程序的文件夹权限?

    我目前正在构建一个 C WebApi 2 应用程序 我将其上传到 Amazon Elastic Beanstalk 实例进行部署 到目前为止 我取得了成功 并且在我的本地计算机上 我刚刚完成了文件上传功能的测试 以便客户端上传图像 它的方式
  • 在 VirtualBox 来宾中运行 perf

    我的教授要求我跑步 perf stat e mem loads mem stores test 为了让我找到 C 文件的内存加载和存储 我在 VirtualBox Linux 来宾中执行此操作 问题是perf说这是无效或不受支持的事件 任何
  • 在 Clion 中启用 Cuda 代码索引

    我正在使用 Clion 开发 cuda 程序 当扩展名是 h 时 代码突出显示可以正常工作 但是 当它更改为 cuh 时 Clion 仅将新文件视为纯文本文件 并且我无法启用代码突出显示 我知道完整的 Cuda 工具链是不可能的 所以我不希
  • 为 Outlook 2007 构建表单

    我刚刚了解到 Outlook 表单的概念 我不知道这是否能解决我的问题 但这就是我想做的 我希望能够让公司内部的员工填写一些表格 那么我所要做的就是创建表单并将其推送到他们的 Outlook 中 他们填写表格后 我可以以某种方式捕获数据吗
  • WebAPI OData $格式转换为xml

    对于我的 WebAPI OData 应用程序 我试图让我的客户端 浏览器 决定数据输出应该采用什么格式 作为 format尚未在 WebAPI OData 中实现 我在这里使用 Raghuramn 的示例 https gist github
  • React + Typescript:如何输入 event.target.name 来声明?

    我有一些反应状态被定义为一个接口并且有专门命名的键 我尝试了下面的解决方案 该解决方案在技术上应该基于状态键工作 但它仍然给我错误 x string string provides no match for the signature 做这
  • 有没有一种简单的方法可以使用 Microsoft Web Optimization 框架/脚本捆绑来呈现绝对 URL?

    我正在尝试使用 Microsoft 的 Web Optimization 框架呈现 JavaScript 包 如下所示 Scripts Render assets bundle js 并构建一个小包 如下所示 public static v
  • Fabric API 密钥无效

    我正在尝试将 Fabric 安装到我的 iOS 应用程序中 我下载了 Fabric 应用程序来安装 Crashlytics 但是当我在应用程序提供的构建阶段添加运行脚本时 在构建项目后出现错误 第 2 行 1 myfirebaseid io
  • 在 PowerShell 代码中测试文件夹是否是连接点?

    如何在 PowerShell 代码中测试文件夹是否是连接点 至少从 PowerShell v5 0 开始 对链接有了更好的支持 或者 MS 称之为 重新分析点 改进的 Item cmdlet LinkType财产 链接的文章位于 WMF 5
  • 如何访问未导出的结构体字段

    Go 1 8 中有没有办法使用 Reflect 来访问未导出的字段 这似乎不再有效 https stackoverflow com a 17982725 555493 注意reflect DeepEqual工作得很好 也就是说 它可以访问未
  • 禁用对读取(无效 JSON)单引号字符串的支持

    Newtonsoft Json for C 支持读取类似内容 key value 但这是不正确的 JSON 是否可以禁用它 以便它更像 PHP 一样解析和读取 其中 PHP 不支持 key value 但 key value 你可以自己写J
  • 编译所需的BLAS和LAPACK库

    我最近下载了 Gnu Octave 的最新稳定版本 并尝试在我的机器上构建并安装它 Ubuntu 10 0 4 LTS 64 位 当我运行 configure 时 我收到以下错误消息 configure error You are requ
  • Scala @ 运算符

    Scala 的 运算符有什么作用 例如 在博客文章中Scala 中的形式语言处理 第 2 部分有这样的东西 case x Some Nil gt x 它使人们能够将匹配的模式绑定到变量 例如 考虑以下情况 val o Option Int
  • 如何将 stringstream 内容放入 char 而不是 string 类型?

    大家都知道stringstream str 需要一个字符串变量类型来存储内容stringstream str 进去 我想存储的内容stringstream str 转换为 char 变量或 char 数组或指针 可以这样做吗 请写一个简单的
  • 为什么我的正则表达式与 r'string' 匹配,但使用 Python 时不匹配 'string'?

    正则表达式在 Python 中的工作方式是如此令人费解 以至于每一秒都让我更加愤怒 这是我的问题 我知道这给出了一个结果 re search r bmi b grand rapids mi 49505 虽然这没有 re search bmi
  • 迅速。无主相对于弱者的(绝对)唯一的具体优势是性能吗?

    在 Swift 中 我们有正常的默认类型 该对象根本不能变为零 我们有弱类型 该对象可以变为零 如果对象变成nil 你的指针自动变成nil 所以你知道对象变成了nil 我们有无主打字 该对象可以变为零 如果对象变成 nil 你的指针不会发生