将类别添加到UIWebView时出现运行时错误

时间:2016-08-09 06:58:29

标签: ios objective-c exception uiwebview categories

描述

我只是向UIWebView+CategoryTest添加了一个类别UIWebView,其中使用自定义方法layoutSubviews对其hlz_layoutSubviews进行了调整,但UIWebView从不在我的项目中使用。当我构建并运行应用程序时,在激活[self hlz_layoutSubviews];

时会出现运行时错误
  

CategoryTest [29881:2122091] - [UIWindow hlz_layoutSubviews]:无法识别的选择器发送到实例0x7f8e73d311e0

我错过了什么吗?

重现问题的步骤

  1. 使用Xcode中的Single View Application模板创建一个空项目。
  2. UIWebView+CategoryTest添加新类别UIWebView
  3. UIWebView+CategoryTest.m中的代码替换为以下内容:
  4. ```

    @implementation UIWebView (CategoryTest)
    
    + (void)load {
        // Swizzle the `layoutSubviews` method.
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Method originalMethod = class_getInstanceMethod(self, @selector(layoutSubviews));
            Method swizzledMethod = class_getInstanceMethod(self, @selector(hlz_layoutSubviews));
    
            method_exchangeImplementations(originalMethod, swizzledMethod);
        });
    }
    
    - (void)hlz_layoutSubviews {
        [self hlz_layoutSubviews];
    }
    
    @end
    

    ```

    1. Exception Breakpoint
    2. 中为All Exceptions添加Breakpoint navigator
    3. 构建并运行演示应用程序。

1 个答案:

答案 0 :(得分:0)

在与其他开发人员讨论之后,原因是我在UIWebView中调出的方法UIView是由它的超类UIWindow实现的。因此,方法的交换也会影响UIView的其他子类,例如layoutSubviews。因此,当UIWindow发送到hlz_layoutSubviews的实例时,实际上会向其发送混合的range.format.protection.locked = false;