参考计数

引用计数是一种机制,它通过原子地递增递减引用计数来跟踪对诸如对象,内存块和其他资源之类的资源的引用数。

每当引用一个对象时,该对象都会保留,而引用减少时,则该对象将被释放

一旦引用计数或保留计数变为0,内存将被取消分配并回收。

一切似乎都是直截了当的,但是我仍然有以下关于引用计数的问题。

什么是原子?

好吧,原子是元素可以划分的最小单位。 因此, 原子操作是可以操作的最小操作[1]。

原子操作的优点是它们不会阻塞竞争线程[2]

那么这对于声明为atomic的属性意味着什么呢?

好吧,这意味着您尝试对该属性进行的任何操作都必须等待上一个操作完成! 这也是原子慢的原因。

这是否意味着atomic是线程安全的

让我们看一下线程安全意味着什么:

“如果一段代码在多个线程同时执行期间正常运行,那么它就是线程安全的。” [3]

但是,通过将属性视为atomic ,只能确保在尝试获取属性时为您提供一个值。

这是一个代码示例,显示即使原子属性也不是线程安全的:

并发队列中的原子属性

关于原子如何工作的研究~~~

medium.com

至于如何使线程安全程序~~~将不得不等待。

旁注

。 这是我听到的一个面试问题: 您如何利用生活经历来解释保持周期?

→首先,保留周期是两个对象同时保持一个而另一个导致引用计数从不减为0,因此两个对象都被保留。

一个著名的例子是Titanic XDDD的Jack和Rose

class Rose { var jack: LoveOfHerLife } 
class Jack { var rose: LoveOfHisLife }

创建RoseJack时,他们注定是彼此对生活的热爱,所以我只是将他们对生活的热爱分配给彼此。

 让rose = Rose() 
让jack = Jack()
rose.jack =杰克...杰克保留+1
jack.rose =玫瑰...玫瑰保留+1

现在, 玫瑰杰克被彼此保留了。

由于默认情况下变量是变量,即使它们的生命周期结束,它们仍将彼此保持……直到最后……。 悲伤的电影

但是,那还不是故事的结局吗?

我将在以后谈论更多关于内存泄漏的问题,现在,我只想让您知道要解决此问题,您只需向变量添加weak:

weak var jack : LoveOfHerLife

太好了! 现在玫瑰将在他生命周期的尽头时放开杰克 ……就像电影一样。 浪漫吧? ~~~

参考

http://mrpeak.cn/blog/ios-thread-safety/

参考计数

通常,在已知将来不会使用某个物体时,最好将其销毁。 参考计数…

www.threadingbuildingblocks.org

http://www.drdobbs.com/atomic-reference-counting-pointers/184401888