我在我的应用程序上使用DAKeyboardControll。它有一个名称为:swizzled_addSubview的方法,并实现如下:
- (void)swizzled_addSubview:(UIView *)subview
{
if (!subview.inputAccessoryView)
{
if ([subview isKindOfClass:[UITextField class]])
{
UITextField *textField = (UITextField *)subview;
if ([textField respondsToSelector:@selector(setInputAccessoryView:)])
{
UIView *nullView = [[UIView alloc] initWithFrame:CGRectZero];
nullView.backgroundColor = [UIColor clearColor];
textField.inputAccessoryView = nullView;
}
}
else if ([subview isKindOfClass:[UITextView class]]) {
UITextView *textView = (UITextView *)subview;
if ([textView respondsToSelector:@selector(setInputAccessoryView:)] && [textView respondsToSelector:@selector(isEditable)] && textView.isEditable)
{
UIView *nullView = [[UIView alloc] initWithFrame:CGRectZero];
nullView.backgroundColor = [UIColor clearColor];
textView.inputAccessoryView = nullView;
}
}
}
[self swizzled_addSubview:subview];
}问题
最近,在与AutoLayout兼容的新版本中,我收到了一些有关此方法的崩溃,以及它们的原因:-[UIView(DAKeyboardControl) swizzled_addSubview:],EXC_BAD_ACCESS KERN_PROTECTION_FAILURE at 0x0090dffc
我知道这个问题已经发生在很多电话中,但是为什么不能正确工作?
这次事故只发生在8个用户54次,其中50 %的人有越狱设备,但另一个人有一个非越狱设备!
发布于 2015-10-13 07:43:33
方法swizzling在运行时引发问题。我也有同样的例外,为了摆脱这个问题,我使用了BABFrameObservingInputAccessoryView,这对我来说很好。https://github.com/brynbodayle/BABFrameObservingInputAccessoryView
发布于 2015-10-13 09:45:26
最有可能的情况是,您的方法实际上是不灵活的,因此您将得到一个递归调用,它显然会崩溃。这就是swizzling的棘手之处:它交换两种方法,因此每次对addSubview的调用都会调用swizzled_addSubview,而对swizzled_addSubview的调用实际上会调用addSubview。
https://stackoverflow.com/questions/32930788
复制相似问题