即使不需要也使用弱变量的缺点?

Disadvantages of using weak variables even when not needed?

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

在 ARC 下,只要至少有一个对该对象实例的强引用,对象实例就存在。

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

如果您对对象实例进行多个引用,则必须考虑将其标记为弱还是强(取决于特定代码),这是没有办法解决的。

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

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

另一方面,您可以提出相同的问题以获得强有力的参考。不同之处在于,当您只保留强引用(没有弱引用)时,您不必考虑弱引用或强引用,它会起作用。 (单靠弱很可能行不通) 但是你必须 100% 确定将对你不再需要的每个对象的每个强引用都清空。

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

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

作为规划如何构建强/弱定义的一种简单方法,将一个特定的 class 视为 属性 的所有者,然后将其赋予强定义。这意味着 属性 将保留下来供该所有者使用。如果另一个 class 也有对 属性 的引用,但不要求 属性 始终坚持它 - 使其变弱。只要主要所有者 class,比如 View Controller,仍然存在 - 那么 属性 也会存在。如果两者都设置为 weak,那么即使 属性 仍然出现,它也将是空的,因为在运行时,确定没有人真正需要它,因此将其删除。