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

时间:2016-02-10 14:26:34

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

只要对该对象实例至少有一个强引用,ARC对象实例就是活动的。

如果您将所有变量标记为弱变量,则不会对对象实例进行强引用,也不会有任何变量保持活动状态。它会在创建后立即销毁。

如果您要对对象实例进行多次单独引用,则必须考虑是否应将其标记为弱或强(取决于特定代码),否则无法绕过它。