Tag: 参考计数

参考计数

引用计数是一种机制,它通过原子地递增和递减引用计数来跟踪对诸如对象,内存块和其他资源之类的资源的引用数。 每当引用一个对象时,该对象都会保留,而引用减少时,则该对象将被释放 。 一旦引用计数或保留计数变为0,内存将被取消分配并回收。 一切似乎都是直截了当的,但是我仍然有以下关于引用计数的问题。 什么是原子? 好吧,原子是元素可以划分的最小单位。 因此, 原子操作是可以操作的最小操作[1]。 原子操作的优点是它们不会阻塞竞争线程[2] 那么这对于声明为atomic的属性意味着什么呢? 好吧,这意味着您尝试对该属性进行的任何操作都必须等待上一个操作完成! 这也是原子慢的原因。 这是否意味着atomic是线程安全的 ? 让我们看一下线程安全意味着什么: “如果一段代码在多个线程同时执行期间正常运行,那么它就是线程安全的。” [3] 但是,通过将属性视为atomic ,只能确保在尝试获取属性时为您提供一个值。 这是一个代码示例,显示即使原子属性也不是线程安全的: 并发队列中的原子属性 关于原子如何工作的研究~~~ medium.com 至于如何使线程安全程序~~~将不得不等待。 旁注 。 这是我听到的一个面试问题: 您如何利用生活经历来解释保持周期? →首先,保留周期是两个对象同时保持一个而另一个导致引用计数从不减为0,因此两个对象都被保留。 一个著名的例子是Titanic XDDD的Jack和Rose class Rose { var jack: LoveOfHerLife } class Jack { var rose: LoveOfHisLife } 创建Rose和Jack时,他们注定是彼此对生活的热爱,所以我只是将他们对生活的热爱分配给彼此。 让rose = Rose() 让jack = Jack() rose.jack =杰克…杰克保留+1 […]

开始进行Swift编程,第7部分-初始化和反初始化,覆盖和引用计数

在上一篇文章中,我们讨论了结构,类,属性和方法。 开始进行Swift编程第6部分-结构,类,属性和方法 在上一篇文章中,我们介绍了函数,枚举和范围。 medium.com 它帮助我们弄清楚如何创建对象以及将类似的属性和方法组合在一起。 本系列的内容不会教您Apple提供的更具体的类,例如UIButton或更实际的URLSession。 它会教给您足够的知识,因此当您在自己的程序中看到这些类时,您将对如何开始使用它们有所了解。 因此,让我们深入研究这一课。 从最基本的意义上讲,类和结构的初始化是为类和结构提供值。 有时,我们希望类或结构在创建时具有默认值,而其他时候,我们想告诉类或结构其默认值是什么。 初始化Class和初始化Struct之间的区别是:Swift中的Struct有自己的默认初始化器 ,而Classes没有。 这是什么意思? 这意味着当我们创建结构时,我们不需要在Struct中包含init()方法,它会自动为您创建。 仅当创建类时未实例化该类的属性时,类才必须具有init()方法。 让我们看看我在说什么。 在myFullyInitializedClass我们可以使用 var myFirstClass = myFullyInitializedClass() 。 如果要使用myFirstClass.myFunction()调用函数,则它将返回整数1因为我们为该类设置了初始值。 在myNonInitializedClass ,我们需要传入给定的givenNumber来创建它,以便初始化该类的所有属性。 在这种情况下,我们只有一个属性,但是如果有更多属性,则必须传递所有默认值。 只需将init()方法想像为目前没有func关键字的函数即可。 其唯一目的是为类中的属性分配值。 当我们调用方法myFunction ,它将返回值2 。 在myStruct示例中,我们没有初始化程序,因为在后台为我们创建了默认初始化程序。 创建新结构时,我们使用var myThirdStruct = myStruct(firstNumber: 3) 。 不,我们没有创建3个结构,但我以这种方式命名,因此您可以看到类和结构的总体顺序。 我们可以调用myThirdStruct.myFunction ,该方法将返回3 。 如果我们要创建一个myStruct的新实例,而不传递第一个数字的默认值,则会收到错误消息。 因此,对于结构,您必须设置默认值或在调用它时传递一个默认值。 可以在类和结构中使用Optionals以满足初始化程序的要求。 假设您创建的类并不总是需要其所有属性。 我们可以将不需要的属性设置为立即可用。 通过使用可选值,我们不必包括初始化程序,但是,如进一步所示,我们需要强制展开可选值,以删除设置了我们值的Optional()包装器。 我知道我告诉过您不要使用! ,强制解包,操作员。 但是如果没有更多工具可供使用,那么现在就必须这样做。 不用担心那些新工具即将推出。 如果您确实解开了nil可选项,则程序将崩溃,并且Found nil while […]

ARC如何快速工作

在开始示例之前,我想分享一些方法,通过在实例上调用它们,实例的保留计数增加或减少。 我将向您展示自动引用计数工作的示例。 这里的示例从Owner类开始。 其中具有存储的属性,即名称。 下一个代码段定义了Owner?类型的三个变量。 您已经创建了一个新的Owner实例,并将其分配给owner1变量: 现在,已将新所有者实例分配给owner1变量,现在从owner1到新Owner实例都有很强的引用。 因此实例引用计数将为1。 如果将同一Owner实例分配给另外两个变量,即owner2,owner3。 建立了对该所有者实例的两个更强引用: 现在,对该单个Owner实例有3个强引用。 如果要取消分配Owner实例,则需要删除对该实例的强引用。 注意:当实例引用计数达到零时,该实例将从内存中取消分配。