美文网首页iOS 开发 iOS开发记录
UIAlertController的循环引用问题

UIAlertController的循环引用问题

作者: 码动人生 | 来源:发表于2016-07-12 16:46 被阅读866次

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

    相关文章

      网友评论

        本文标题:UIAlertController的循环引用问题

        本文链接:https://www.haomeiwen.com/subject/iifsjttx.html