uilaertview和uiactionsheet的坑

这两个控件以及UIDatePicker   UIImagePickerController的delegate属性都是assign的,这样会导致delegate的viewcontroller野指针。我想不明白为何苹果不设置成weak型指针。

当uialertview的delegate设置成controllerA之后,如果在alertview还是show状态的时候,此时controllerA释放了(比如收到通知被pop出去了)。这个时候delegate就是野指针。此时点击alert view调用代理的方法就会发生崩溃。

当时想到了若干种解决方案,但是最终采用了一种很反锁,但比较实用的方法。

在viewcontroller每次dealloc或者viewwilldisapper的时候取消掉上述的这些控件。这个方法就是必须把控件保存成成员变量。

- (void)hideAllPickersAndActionSheetsAndAlertViews
{
    if (_actionSheet) {
        [_actionSheet dismissWithClickedButtonIndex:[_actionSheet cancelButtonIndex] animated:NO];
        _actionSheet = nil;
    }
}

希望看到这篇文章的人可以说下自己的解决方案。

以下是本人想到的几种方案:

1.自己想一个alertview(继承自系统)。将delegate替换掉,相当于hook一下。重新写一遍所有的delegate方案。在方法里进行判断,然后运行真正的delegate。

此方法可以解决崩溃。但是不会在viewcontroller消失的时候也跟着消失掉。

2.hook掉viewcontroller的dealloc。在dealloc的时候判断window和window的subview是否包含以上控件。但是性能需要考虑。而且在alert view出现的时候,系统的key window已经被替换掉另外一个class了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值