NSObject+QNSwizzle.m 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // NSObject+QNSwizzle.m
  3. // HappyDNS
  4. //
  5. // Created by yangsen on 2020/4/13.
  6. //
  7. #import "NSObject+QNSwizzle.h"
  8. #import <objc/runtime.h>
  9. @implementation NSObject(QNSwizzle)
  10. + (BOOL)qn_swizzleInstanceMethodsOfSelectorA:(SEL)selectorA
  11. selectorB:(SEL)selectorB{
  12. Method methodA = class_getInstanceMethod(self, selectorA);
  13. Method methodB = class_getInstanceMethod(self, selectorB);
  14. if (!methodA || !methodB) {
  15. return NO;
  16. }
  17. class_addMethod(self,
  18. selectorA,
  19. class_getMethodImplementation(self, selectorA),
  20. method_getTypeEncoding(methodA));
  21. class_addMethod(self,
  22. selectorB,
  23. class_getMethodImplementation(self, selectorB),
  24. method_getTypeEncoding(methodB));
  25. method_exchangeImplementations(class_getInstanceMethod(self, selectorA),
  26. class_getInstanceMethod(self, selectorB));
  27. return YES;
  28. }
  29. + (BOOL)qn_swizzleClassMethodsOfSelectorA:(SEL)selectorA
  30. selectorB:(SEL)selectorB{
  31. Method methodA = class_getInstanceMethod(object_getClass(self), selectorA);
  32. Method methodB = class_getInstanceMethod(object_getClass(self), selectorB);
  33. if (!methodA || !methodB) {
  34. return NO;
  35. }
  36. class_addMethod(self,
  37. selectorA,
  38. class_getMethodImplementation(self, selectorA),
  39. method_getTypeEncoding(methodA));
  40. class_addMethod(self,
  41. selectorB,
  42. class_getMethodImplementation(self, selectorB),
  43. method_getTypeEncoding(methodB));
  44. method_exchangeImplementations(class_getInstanceMethod(self, selectorA),
  45. class_getInstanceMethod(self, selectorB));
  46. return YES;
  47. }
  48. @end