UIAlertController的循环引用问题

在iOS中系统的弹窗提示有三个控件可以使用。分别是UIAlertView(iOS9.0过时)和UIActionSheet(iOS8.3过时),他们在iOS9.0都已经过时。

系统推出了新的控件UIAlertController控件 他整合UIAlertView和UIActionSheet两者的特点。

它的使用相对比较方面简单,基本使用如图

创建和展示UIAlertController的步骤

1.创建AlertController对象。 并且指定title和message信息,通过preferredStyle可以指定要展示的样式(分别是;alertView和ActionSheet两种样式)

2.创建UIAlertAction事件。 它是用来进行操作的选项可以有多个。每一个alertAction对象都对应一个handler代码块它里面是 当触发此选项时要做的操作

3.把alertAction添加到UIAlertController中

4.展示UIAlertController控制器

上述四个步骤是 在使用UIAlertController的基本操作。但是在使用时有一个特别容易被忽视的地方就是在 handle事件中使用了 UIAlertController控制器。这里会造成循环引用,在堆内存中残留大量的无用对象无法被销毁。

产生循环引用的原因:

a.创建的UIAlertAction会被UIAlertController的一个actions属性引用。

b.在UIAlertAction中他的handler代码块 会引用UIAlertController对象(如果是直接使用UIAlertController对象)。

c.actions属性又被UIAlertController对象引用。

当UIAlertController对象被销毁时 堆中的abc三条引用线就会一直保留

解决上述循环引用的办法就是在b这条线上进行额外处理,在代码块中不直接使用UIAlertController对象 而是使用__weak处理

解决直接使用alertController

注意:为了验证处理之后的效果 可自定义UIAlertController类重写dealloc方法 判断是否正确被销毁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容