分类中如何调换 init 方法

我需要把所有 view 以及子类的 layer.opaque 设置为 YES,那么我在 view 的分类上调换 init 方法,但是交换方法中 [super __init]; 出现了 No visible @interface for 'UIResponder' declares the selector '__init' 报错,我该如何在分类处理呢?

@implementation UIView (__Performance)

+ (void)load{
    // 方法调换
    [self __exchangeInstanceMethodWithOriginSEL:@selector(init)
                                    exchangeSEL:@selector(__init)];
}

#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)__init{
    self = [super __init];
    if (self) {
        self.layer.opaque = YES;
    }
    return self;
}

@end
阅读 3.6k
3 个回答
新手上路,请多包涵

self = [self __init]

试试:

- (instancetype)__init {
    id __self = [self __init];
    if (self.layer) {
        self.layer.opaque = YES;
    }
    return __self;
}
新手上路,请多包涵
  • (void)load{
    // 方法调换
    [self __exchangeInstanceMethodWithOriginSEL:@selector(init)

                                exchangeSEL:@selector(__init)];

}

pragma clang diagnostic ignored "-Wobjc-designated-initializers"

  • (instancetype)__init{
    self = [super init];
    if (self) {

    self.layer.opaque = YES;

    }
    return self;

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题