【问题标题】:Swift with no ARC没有 ARC 的 Swift
【发布时间】:2014-08-28 06:48:18
【问题描述】:

是否可以使用 SWIFT 使用手动内存管理(而不是自动引用计数)来编写应用程序?

我可以使用 Swift 调用 retainrelease 吗?

【问题讨论】:

  • 在我下面的答案中的 cmets 和 @newacct 的答案之后,我现在想知道:您是否想在项目中的 some 对象上避免 ARC,或者关闭 ARC整个项目?可以在您的问题中明确说明吗?

标签: memory-management swift automatic-ref-counting


【解决方案1】:

您可以在 Unmanaged<T> 值上调用 retainreleaseUnmanaged 基本上是 ARC 管理之外的对象指针。但是您必须转换为托管指针才能与 Cocoa API 交互。

但除非在特殊情况下,否则您不会想要这样做。而没有转成ARC的项目就不是这样的情况了。

【讨论】:

  • 一个很好的理由是当你实现 LinkedList 时。在列表中存储大量对象时,使用 arc 会导致崩溃。请参阅:forums.swift.org/t/…
【解决方案2】:

注意 2014 年 8 月 29 日 - 我下面的答案不正确,有可能,请查看 @newacct 答案

不,你不能。阅读有关Automatic Reference Counting 的更多信息。

你一定有充分的理由不想要 ARC

【讨论】:

  • 嗯,好的。害怕你想做一些奇怪的事情:)
  • 我正在处理一个非 ARC 项目,我想知道是否可以添加 Swift 代码而不将其转换为 ARC 项目。
  • @godmoney - 使用 ObjC,您可以混合使用 ARC 和非 ARC 库。所以,我猜答案是“可能”。
  • 安东尼奥,不想要 ARC 有充分的理由。 ARC 在很多地方都将强引用作为默认值。我认为强引用是错误的默认设置(如果你真的很好奇,可以链接我的文章)。无论如何,我的观点是,您在自己的答案中插入了一个有争议的评论,并且像许多人一样,您似乎认为像 GC 和 ARC 这样的内存管理自动化“几乎无可争辩地好”。
  • 好的。在这种情况下,请查看@newacct 答案,看来我错了,可以使用Unmanaged 绕过ARC。从来没有考虑过,因为这是我会不惜一切代价避免的事情:)但是如果你说你需要它,那么你可以
【解决方案3】:

目前无法像使用 objc 那样快速关闭 ARC(例如,每个带有编译器标志的文件)。正如其他人指出的那样,有“Unmanaged”和“UnsafeMutablePointer”API,专为与 C API 交互而设计,允许您在某些情况下绕过 ARC。然而,这些 API 很繁琐,需要您对代码进行大量更改(例如与数组交互)。

Swift 人员通常希望您重写代码以使用结构并尽可能避免引用问题。但这使得移植现有代码很痛苦。

在我的另一篇文章中有一些关于 ARC 性能的建议:Swift Dictionary slow even with optimizations: doing uncessary retain/release?,但没有一个非常令人满意。

我什至编写了代码来对已编译的 mach-O 目标代码进行后处理,并从某些类中删除 ARC swift_retain/release 调用作为实验。但我真的希望现在 Swift 是开源的,我们可以对其进行修改,使其在未来更加灵活。

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2012-02-25
    • 2016-06-18
    相关资源
    最近更新 更多