在Swift中,我们有正常的默认输入
我们的打字很弱
我们有无主打字
(所以:通过推论:你可以使用的唯一一次"无主"如果你"绝对知道"对象将永远不会变为零。)
现在:
在我看来,以下句子,
绝对是真的......
绝对我的意思是,真的,真的,绝对地,归结为最深刻的哲学关注真实......
因而是逻辑推论:
{旁白 - 我能想到的唯一其他差异在于自我记录意义。如果我使用无主,它会让我的开发人员知道某些事情;让我们暂时搁置这个问题。)
所以我的问题很简单,非常准确,非常具体:上面是大胆的句子" true" (在"完全,非常,壮观"真正的真实感)。
答案 0 :(得分:3)
粗体句子不正确。
Weak
是可选的,可以随时设置。
Unowned
是非可选的,但可以是零。如果发生这种情况,你称之为你的应用程序崩溃。它必须在初始化期间设置。
另一个不同之处在于表现,正如作者所说。 Unowned
不进行任何检查,并且比weak
稍快。
它更好地显示了类之间的关系。
您可以查看此SO问题以获取更多详细信息:What is the difference between a weak reference and an unowned reference?
答案 1 :(得分:3)
我同意Yannick的观点。你的大胆陈述是不正确的。无主参考必须在其生命周期内有效。在-Ounchecked
程序中,未能保持此前提条件的行为是未定义的。我不是故意"它崩溃了。"我的意思是它不是一个结构良好的计划;它未定义它的作用。即使在-Ounchecked
下,弱引用也不会因其释放而生成未定义的行为。
使用unowned
是程序员声明该引用在其整个生命周期内都有效。这甚至都不是Type!
断言的。 !
类型只是断言引用在访问它时是有效的。这就是为什么你无法对无主人的x == nil
进行测试的原因。它不是可选的。它不是伪装的可选" (如Type!
)。它必须始终有效。
与弱引用不同,当另一个实例具有相同的生命周期或更长的生命周期时,将使用无主引用。 ...无主参考预计始终具有值。 - [The Swift Programming Language]
那么对于你最深刻的哲学,"无主的包括一个不存在于弱势中的先决条件。这个先决条件存在于程序之外,必须由程序员而不是编译器证明,以确保程序结构良好。
对于是否有理由使用unowned
,我们肯定会采取最绝对的立场(如您的问题所示)。在已知前提条件为真的情况下,它是最严格的类型。 weak
类型比unowned
弱;它表达的前提条件较少。良好的类型理论鼓励我们使用最强(最严格;最少的法律价值)类型,unowned
是比weak
更强的类型。
在非绝对主义者("实践")意义上,选择更强类型的结果是更简单的代码。当你使用weak
时,你必须不断地重新断言每次使用它时都不是nil
的前提条件并处理它的情况(可能插入fatalError
只是重新发明unowned
有更多工作)。使用unowned
可以让您断言此前置条件一次。这样可以创建更简单,更正确的代码。我从未使用unowned
来提高速度。我总是用它来避免一遍又一遍地回答#34;但如果它没有问题怎么办?"在代码里,它绝不能是零。
答案 2 :(得分:0)
来自迅捷文档
“在某些情况下,Swift还提供了不安全的无主引用 需要禁用运行时安全检查-例如,为了提高性能 原因。与所有不安全的操作一样,您要承担责任 用于检查该代码的安全性。
您通过写unowned(unsafe)来表示不安全的无主引用。 如果您尝试在实例之后访问不安全的无主引用 它所指的已被释放,您的程序将尝试访问 实例曾经所在的内存位置,这是不安全的 操作。”
似乎只有在您使用无所有权(不安全)的情况下才能获得性能提升,并且默认情况下,我们使用无权(安全)。
This is from one of the answer
unowned(safe)是一个非所有者引用,它在访问时断言 该对象仍然存在。有点像一个弱的可选参考 用x隐式解开了!每次访问时。 无所有权(不安全)就像__unsafe_unretain在ARC中一样-它是非所有者 参考,但没有运行时检查对象是否仍然存在 在访问时,悬挂的引用将进入垃圾内存。 当前,无主始终是无主(安全)的同义词,但是 目的是将其优化为-Ofast中的无主(不安全) 在禁用运行时检查时构建。