Swift中的内存管理

什么是弱变量? 您知道吗,在IBOutlets前面。 查看苹果的文档,我发现了自动引用计数(ARC)。 Apple使用ARC进行内存管理并跟踪内存使用情况。

诸如强,弱无主之类的关键字会在何时添加或释放保留计数时向ARC发出信号。

坚强的默认Default

每次我们声明一个class属性时,默认值都是一个强引用。

 神奇宝贝类{ 
var名称:String =“ Pikachu”
var skill:Skill = Skill()
}

班级技能{
var类型:字符串=“ Pika Thunder”
}

让myPokemon = Pokemon()
打印(“我的新皮卡丘技能:”,myPokemon.skill.type)

宠物小精灵具有技能属性。 当我们创建Pokemon类时,也会创建Skill类。 因此,Pokemon类具有指向Skill类的强大指针,并增加了Skill的保留计数。 当Pokemon类被释放后,指针将被删除,Skill类将其保留计数减少为零。

参考不足

等一下,如果指针指向两个方向的是双向关系呢? 如果Skill类具有指向Pokemon类的指针,并且Pokemon类被分配了一个值,我们将创建一个保留周期 🔄这可能导致内存泄漏🙁

  class Pokemon {var name:String =“ Pikachu” var技能:Skill = Skill()} class Skill {var type:String =“ Pika Thunder” var pokemon:Pokemon?} let myPokemon = Pokemon()myPokemon.skill.pokemon = myPokemonprint(“我的新皮卡丘技能:”,myPokemon.skill.type) 

现在,我们有两个对象,将彼此的保留计数加一,并且无法减少计数。 这意味着将永远不会在任何一个对象上调用dealloc方法。

我们可以通过…轻松地解决这个问题……请打鼓roll

使用引用!

引用和引用之间的区别在于, 引用不会增加对象的保留计数。

通常,将父母标记为弱者是最佳做法。

  class Pokemon {变量名称:字符串=“ Pikachu” var技能:Skill = Skill()} class Skill {变量类型:String =“ Pika Thunder”弱var pokemon:神奇宝贝?} let myPokemon = Pokemon()myPokemon.skill.pokemon = myPokemonprint(“我的新皮卡丘技能:”,myPokemon.skill.type) 

如果使用委托模式,则可能需要将委托标记为弱。

无人参考

无主引用假定存在引用,类似于隐式展开的optionals

也..

弱引用一样, 无主引用不会增加保留计数

但是,如果您尝试访问一个未拥有的引用,但该引用不存在,它将使应用程序崩溃。

结论

创建引用类型时,应考虑强引用和弱引用,因为内存管理在所有平台上都很重要。

强: 🐿 ➡️🌰

弱: 🐿➡️⬅️🌰