1

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% 的用户拥有越狱设备,而另一个人拥有非越狱设备!

4

2 回答 2

0

很可能你的方法实际上并没有被调配,所以你会得到一个递归调用,这显然会崩溃。这就是 swizzling 的棘手之处:它交换了两个方法,所以每次调用 addSubview 都会调用 swizzled_addSubview 而调用 swizzled_addSubview 实际上调用 addSubview。

于 2015-10-13T09:45:26.333 回答
0

方法调配会导致运行时出现问题。我也遇到了同样的异常,为了摆脱这种情况,我使用了 BABFrameObservingInputAccessoryView,这对我来说很好用。https://github.com/brynbodayle/BABFrameObservingInputAccessoryView

于 2015-10-13T07:43:33.627 回答