objective-c中retain和strong有什么区别?

时间:2016-05-25 05:11:21

标签: objective-c cocoa

期待其他回应: - ARC和非ARC环境

1 个答案:

答案 0 :(得分:1)

保留释放周期(RRC)的强大而微弱的帮助,这是一种内存泄漏形式。 iOS使用称为自动引用计数(ARC)的东西来了解对象何时正在使用并应保留在内存中,或者不再使用,应删除以获取资源。 ARC之所以有效,是因为运行时知道每个对象,引用它的对象数量。当找到的值达到0时,将删除该对象。

如果有两个对象相互引用,则会出现问题。因为对象A持有对象B的引用,而B持有对A的引用,所以A和B的引用计数永远不会为0,这个A和B将始终在内存中。也有可能没有其他对象持有对A或B的引用,因此我们只是创建了内存泄漏。

回到Strong和Weak,这些关键字用于表示所有权",如果愿意的话。它们通过限制哪些对象增加另一个对象的引用计数来帮助您消除保留释放周期。强属性是增加对象引用计数的属性。如果对象A具有对B的强引用,并且没有其他对象引用B,则B具有计数1(A拥有或需要存在B)。现在,如果B想要引用A,我们会想要使用弱引用。弱引用不会增加对象的引用计数。因此,在这种特殊情况下,如果A没有引用它的其他对象而是B,则给定B的弱引用,A的计数将为0。

你能看到这是如何消除RRC的吗?假设没有外部引用而没有使用强/弱引用,A和B将永久驻留在内存中。使用我们上面概述的强引用和弱引用,A将计数为0,因此它将从内存中删除。这反过来会将B的引用计数从1减少到0,从而导致B从内存中删除。

Nonatomic用于表示被引用的对象不是线程安全的。这意味着该对象无法同时处理多个请求。原子性是这样的想法:一旦你提出请求,它就会发生或者它没有发生。当操作是原子操作时,您保证您正在应用操作的实体永远不会处于中间状态。无论你如何看待该实体,它都要么看起来像你在请求操作之前所做的那样,要么它看起来就像操作完成后那样。 (在考虑原子性时,请考虑原子。这个词意味着不可分割。原子操作是那些不能分成小操作的操作。)