iOS strong weak unowned引用

公司的2.0已经拿Swift全部重写了一遍,原本以为自己对Swift的基础了解应该是足够了,看来我还是想多了,当程序员确实是一个很有挑战性的工作。

这篇文章主要写一下ARC相关的知识

1. Strong

原来我还以为Strong没什么好写的,后来我发现我对强引用循环的理解有点偏差。


iOS strong weak unowned引用_第1张图片
image.png

这样一个强引用循环。john持有的apartment属性强引用了unit4Aunit4A持有的tenant属性强引用了john
这里分两种情况:

  • jhon或者unit4A设置成nil,或者两者都设置成nil,并不能消除这个强引用循环。也就是会造成内存泄漏。
  • jhonapartment或者unit4Atenant设置成nil,则可以取消掉这个强引用循环。

2. Weak和Unowned

二者的具体使用方法我这里就不写了,可以参考文章在最后给的链接。这里我主要是记录一下二者的区别。

  • 关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用unowned,如果存在被释放的可能,那就选择用weak
  • 也就是说unowned不可为nilweak可以为nil

3. 使用选择

  • 两个属性的值都允许为nil,并会潜在的产生循环强引用。这种场景最适合用弱引用来解决。
  • 一个属性的值允许为nil,而另一个属性的值不允许为nil,并会潜在的产生循环强引用。这种场景最适合通过无主引用来解决。
  • 两个属性的值都不允许为nil,并会潜在的产生循环强引用。这种场景需要一个类使用无主属性,而另外一个类使用隐式解析可选属性。(隐式可选属性也就是声明属性的时候,在类型后面加上!,比如: var p: Person!

参考链接: http://yulingtianxia.com/blog/2014/06/17/swiftzhong-de-arc/

你可能感兴趣的:(iOS strong weak unowned引用)