原文:http://coolketang.com/staticCoding/5a99261ffe88c21c80b14c31.html
1. 本节课将通过一个实例,演示内存的泄露问题以及如何修复。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/afcff194fde4b1ed9233c8570ecedea0.webp?x-image-process=image/format,png)
2. 首先定义一个用来创建实例的类。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/92d7c92640b78cfd4e186d1934b9c6bc.webp?x-image-process=image/format,png)
3. 给类添加一个属性。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/eaa9b8904020987c259363285f821a83.webp?x-image-process=image/format,png)
4. 添加第二个属性,该属性的类型是一个自定义的类。我们将在后面的代码中实现该类。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/4340e8f74e8528902be5c06ddf9acb78.webp?x-image-process=image/format,png)
5. 添加一个初始化方法,以对名称属性进行设置。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/a034ca6252bdde442f4affb7bd8a80c0.webp?x-image-process=image/format,png)
6. 接着添加一个析构方法,当该类的实例的引用计数为0时,该方法将被调用。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/375aaa7b948516ec6aa6687a860d204d.webp?x-image-process=image/format,png)
7. 然后实现另一个自定义类。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/ede0501df45b587fb99c90f8ceaf0f41.webp?x-image-process=image/format,png)
8. 给类添加两个属性,第二个属性的类型是第一个自定义类。这样两个类型的实例,就形成了相互引用的状态。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/19e75831d15488866ec36fe090111724.webp?x-image-process=image/format,png)
9. 添加一个初始化方法,以对名称属性进行设置。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/bfc9828769fc1911354e03b5d56e7a2c.webp?x-image-process=image/format,png)
10. 接着添加一个析构方法,当该类的实例的引用计数为0时,该方法将被调用。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/8908d4919cc18d7c485e24e1f3803355.webp?x-image-process=image/format,png)
11. 声明两个自定义类型的对象。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/d35c7ddc6988788d7f5ab07145e8a0eb.webp?x-image-process=image/format,png)
12. 接着对两个对象进行初始化操作,然后点击显示调试区图标,打开控制台。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/7023b0883b1cf9dbaa99465216c338a9.webp?x-image-process=image/format,png)
13. 在控制台显示了两个对象的初始化日志。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/682644954ea28707f66f5df633a478b3.webp?x-image-process=image/format,png)
14. 接着分别设置两个对象的实例属性,使两者相互交叉引用。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/a777b23d30fb56861dee7c8c07acd67d.webp?x-image-process=image/format,png)
15. 此时将两个实例对象设置为空,发现并没有在底部的控制台输出析构日志,说明它们的引用计数不为零。点击垂直滚动条,查看上方的内容。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/72c3b2e65dc53fc14c868f38c3a267be.webp?x-image-process=image/format,png)
16. 那么如何避免因为交叉引用,而造成的内存泄露呢,我们只需要对其中一个引用稍加修改。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/d1486069efa6fd1769919df27d1e208f.webp?x-image-process=image/format,png)
17. 在声明变量的前方,增加了weak弱引用标识符,向编译器说明不希望持有对该实例的引用。此时在控制台输出了析构日志,说明内存已经被正常释放了。
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/881e5098b1a12fc0bc0d846ccf85d6e7.webp?x-image-process=image/format,png)
![Swift4互动教程](https://i-blog.csdnimg.cn/blog_migrate/d1f6d0c7b392cc0825addeed461d925e.webp?x-image-process=image/format,png)
本文整理自:《Swift4互动教程》,真正的
[手把手]教学模式,用最快的速度上手iOS开发和Swift语言,苹果商店App Store免费下载:
https://itunes.apple.com/cn/app/id1320746678
,或扫描本页底部的二维码。课程配套素材下载地址:
资料下载
![](https://i-blog.csdnimg.cn/blog_migrate/14e41f97b6d4b51f7bc11081e2a0e101.png)