公司的2.0已经拿Swift全部重写了一遍,原本以为自己对Swift的基础了解应该是足够了,看来我还是想多了,当程序员确实是一个很有挑战性的工作。
这篇文章主要写一下ARC相关的知识
1. Strong
原来我还以为Strong没什么好写的,后来我发现我对强引用循环的理解有点偏差。
image.png
这样一个强引用循环。john
持有的apartment
属性强引用了unit4A
,unit4A
持有的tenant
属性强引用了john
。
这里分两种情况:
- 将
jhon
或者unit4A
设置成nil
,或者两者都设置成nil
,并不能消除这个强引用循环。也就是会造成内存泄漏。 - 将
jhon
的apartment
或者unit4A
的tenant
设置成nil
,则可以取消掉这个强引用循环。
2. Weak和Unowned
二者的具体使用方法我这里就不写了,可以参考文章在最后给的链接。这里我主要是记录一下二者的区别。
- 关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用
unowned
,如果存在被释放的可能,那就选择用weak
。 - 也就是说
unowned
不可为nil
,weak
可以为nil
。
3. 使用选择
- 两个属性的值都允许为
nil
,并会潜在的产生循环强引用。这种场景最适合用弱引用来解决。 - 一个属性的值允许为
nil
,而另一个属性的值不允许为nil
,并会潜在的产生循环强引用。这种场景最适合通过无主引用来解决。 - 两个属性的值都不允许为
nil
,并会潜在的产生循环强引用。这种场景需要一个类使用无主属性,而另外一个类使用隐式解析可选属性。(隐式可选属性也就是声明属性的时候,在类型后面加上!
,比如:var p: Person!
)
参考链接: http://yulingtianxia.com/blog/2014/06/17/swiftzhong-de-arc/
网友评论