首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归swizzling导致崩溃

递归swizzling导致崩溃
EN

Stack Overflow用户
提问于 2015-10-04 06:44:49
回答 2查看 466关注 0票数 1

我在我的应用程序上使用DAKeyboardControll。它有一个名称为:swizzled_addSubview的方法,并实现如下:

代码语言:javascript
复制
- (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 %的人有越狱设备,但另一个人有一个非越狱设备!

EN

回答 2

Stack Overflow用户

发布于 2015-10-13 07:43:33

方法swizzling在运行时引发问题。我也有同样的例外,为了摆脱这个问题,我使用了BABFrameObservingInputAccessoryView,这对我来说很好。https://github.com/brynbodayle/BABFrameObservingInputAccessoryView

票数 0
EN

Stack Overflow用户

发布于 2015-10-13 09:45:26

最有可能的情况是,您的方法实际上是不灵活的,因此您将得到一个递归调用,它显然会崩溃。这就是swizzling的棘手之处:它交换两种方法,因此每次对addSubview的调用都会调用swizzled_addSubview,而对swizzled_addSubview的调用实际上会调用addSubview。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32930788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档