Method Swizzling中判断class_addMethod的意义何在?

无敌鲨鱼炮
  • 448
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SEL SD_SEL = @selector(sd_setImageWithURL:placeholderImage:options:progress:completed:);
        SEL CQ_SEL = @selector(cq_setImageWithURL:placeholderImage:options:progress:completed:);
        
        Method SD_METHOD = class_getInstanceMethod(self, SD_SEL);
        Method CQ_METHOD = class_getInstanceMethod(self, CQ_SEL);
        
        BOOL success = class_addMethod(self, SD_SEL, method_getImplementation(CQ_METHOD), method_getTypeEncoding(CQ_METHOD));
        if (success) {
            class_replaceMethod(self, SD_SEL, method_getImplementation(SD_METHOD), method_getTypeEncoding(SD_METHOD));
        } else {
            method_exchangeImplementations(SD_METHOD, CQ_METHOD);
        }
    });
}

如果我不判断,直接交换有什么隐患?在哪些情况下会触发?

回复
阅读 1.4k
1 个回答
lingjye
  • 2
新手上路,请多包涵

当该类存在继承关系时可能会崩溃

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

宣传栏