递归混合导致崩溃

时间:2015-10-04 06:44:50

标签: ios objective-c crash swizzling isa-swizzling

我在我的应用上使用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%有越狱设备,但另一个人有非越狱设备!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

很可能你的方法实际上没有被调整,所以你得到一个递归调用,这显然会崩溃。这是关于调配的棘手问题:它交换了两种方法,因此每次调用addSubview都会调用swizzled_addSubview,而调用swizzled_addSubview实际上会调用addSubview。