这两个控件以及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了。