UIAlertController的循环引用问题

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

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

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

UIAlertController的循环引用问题_第1张图片
创建和展示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的循环引用问题_第2张图片
当UIAlertController对象被销毁时 堆中的abc三条引用线就会一直保留

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

解决直接使用alertController

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

你可能感兴趣的:(UIAlertController的循环引用问题)