在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方法 判断是否正确被销毁。
网友评论