What is difference between retain and strong in objective-c?
期待其他人的回应:-弧和非弧环境
强和弱帮助保留释放周期(RRC),一种内存泄漏形式。iOS使用一种称为自动引用计数(arc)的东西来知道一个对象何时被使用,并且应该保存在内存中,或者不再被使用,应该删除它来获取资源。ARC工作是因为运行时知道每个对象有多少个对象在引用它。当找到的值为0时,对象将被删除。
当您有两个对象彼此保存引用时,就会出现问题。因为对象A持有对对象B的引用,而B持有对A的引用,所以A和B的引用计数永远不会是0,所以这个A和B将始终在内存中。也可能没有其他对象保存对A或B的引用,所以我们刚刚创建了一个内存泄漏。
回到强和弱,如果你愿意的话,这些关键字被用来"表示所有权"。它们通过限制哪些对象增加另一个对象的引用计数来帮助您消除保留释放周期。强属性是增加对象引用计数的属性。如果对象A对B有强引用,而没有其他对象引用B,则B有计数1(A拥有或需要存在B)。现在,如果B想要引用A,我们需要使用弱引用。弱引用不会增加对象的引用计数。所以在这种特殊情况下,如果A没有其他对象引用它,但是B引用它,那么A的计数将是0,如果B引用弱。
你能看到这是如何消除RRC的吗?假设没有外部引用,也不使用强/弱引用,A和B将永久地驻留在内存中。使用上面概述的强引用和弱引用,a的计数为0,因此它将从内存中删除。这反过来会将B的引用计数从1增加到0,从而导致B从内存中删除。
非原子用于表示在非线程安全中引用的对象。这意味着对象不能同时处理多个请求。原子性的概念是,一旦你提出请求,它要么发生要么不发生。当一个操作是原子性的,你就保证你要应用操作的实体永远不会处于中间状态。不管您如何看待该实体,它要么看起来像您请求操作之前的样子,要么看起来像操作完成后的样子。(当考虑原子性时,考虑原子。这个词的意思是不可分割的。原子操作是指那些不能分为较小操作的操作。)