【问题标题】:Disadvantages of using weak variables even when not needed?即使在不需要时也使用弱变量的缺点?
【发布时间】:2016-05-20 23:02:51
【问题描述】:

似乎自动引用计数 (ARC) 为开发人员增加了跟踪引用的负担。为什么你不能让每个变量都变弱,而根本不用担心强保留周期的发生?

【问题讨论】:

  • 这可能会让您大吃一惊,但 ARC 让这更容易,而不是更难! :)
  • 关掉ARC看看能不能学会做内存管理。可能想先阅读我书中的这一章:apeth.com/iOSBook/…
  • 垃圾回收 (GC) 方便得多;)
  • @TruMan1 就是这样。不幸的是,管理两个交错的内存管理模型并不可行。

标签: objective-c swift automatic-ref-counting


【解决方案1】:

恐怕你只是不了解 ARC。 ARC 会为您计算引用计数,具体取决于某事物被定义为强还是弱(实际上,强会增加引用计数,而弱不会)。如果引用计数变为 0,则将其从内存中删除。因此,如果一切都很弱,属性将立即从内存中删除,您将无法使用它们。实际上,你需要一个强大的地方。

作为一种计划如何构建强/弱定义的简单方法,将一个特定的类视为属性的所有者,并赋予该类强。这意味着该物业将留给该所有者使用。如果另一个类也有对该属性的引用,但不要求该属性始终为它保留 - 让它变弱。只要主要的所有者类,比如视图控制器,仍然存在——那么属性也会存在。如果两者都设置为weak,那么即使该属性仍然出现,它也会为空,因为在运行时,确定没有人真正需要它,因此将其删除。

【讨论】:

    【解决方案2】:

    只要至少有一个对该对象实例的强引用,ARC 下的对象实例就处于活动状态。

    如果将所有变量都标记为弱变量,则不会有对对象实例的强引用,并且没有任何东西可以使其保持活动状态。它会在创建后立即销毁。

    如果您对对象实例的引用不止一次,您必须考虑是否应该将其标记为弱或强(取决于特定代码),没有办法绕过它。

    【讨论】:

      【解决方案3】:

      这是因为只要你需要一个对对象的引用,只要你需要被引用的对象在内存中存在,你就需要一个强引用。

      (你可以回到 Objective-C,在那里你可以在没有 ARC 的情况下完成所有工作,并自己手动进行内存管理。显然这会让你欣赏 ARC。)

      另一方面,您可以针对强引用提出相同的问题。不同之处在于,当您只保留强引用(没有弱引用)时,您不必考虑弱引用或强引用,它会起作用。 (单独弱很可能不起作用) 但是,您必须 100% 确保对不再需要的每个对象的每个强引用都归零。

      旁注: 当您将对象添加到诸如数组或集合之类的集合(或作为视图的子视图)时,这些集合对象将为您保留强引用。在这种情况下,您不必关心,只需在可以丢弃对象时从该集合中删除该对象。这种“技巧”仅在您维护这些集合时才适用 - 例如当它是关于视图层次结构的一部分的视图时,只要它们是必需的。

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 2016-08-16
        • 2014-04-28
        • 2021-04-23
        • 2012-03-29
        • 1970-01-01
        相关资源
        最近更新 更多