SLProxy.m 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //
  2. // SLProxy.m
  3. // DarkMode
  4. //
  5. // Created by wsl on 2020/7/14.
  6. // Copyright © 2020 https://github.com/wsl2ls ----- . All rights reserved.
  7. //
  8. #import "SLProxy.h"
  9. @interface SLProxy ()
  10. ///转发对象目标
  11. @property (nullable, nonatomic, weak, readonly) id target;
  12. @end
  13. @implementation SLProxy
  14. + (instancetype)proxyWithTarget:(id)target {
  15. return [[SLProxy alloc] initWithTarget:target];
  16. }
  17. - (instancetype)initWithTarget:(id)target {
  18. _target = target;
  19. return self;
  20. }
  21. //将消息接收对象改为 _target
  22. - (id)forwardingTargetForSelector:(SEL)selector {
  23. return _target;
  24. }
  25. //self 对 target 是弱引用,一旦 target 被释放将调用下面两个方法,如果不实现的话会 crash
  26. - (void)forwardInvocation:(NSInvocation *)invocation {
  27. void *null = NULL;
  28. [invocation setReturnValue:&null];
  29. }
  30. - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
  31. return [NSObject instanceMethodSignatureForSelector:@selector(init)];
  32. }
  33. - (BOOL)respondsToSelector:(SEL)aSelector {
  34. return [_target respondsToSelector:aSelector];
  35. }
  36. - (BOOL)isEqual:(id)object {
  37. return [_target isEqual:object];
  38. }
  39. - (NSUInteger)hash {
  40. return [_target hash];
  41. }
  42. - (Class)superclass {
  43. return [_target superclass];
  44. }
  45. - (Class)class {
  46. return [_target class];
  47. }
  48. - (BOOL)isKindOfClass:(Class)aClass {
  49. return [_target isKindOfClass:aClass];
  50. }
  51. - (BOOL)isMemberOfClass:(Class)aClass {
  52. return [_target isMemberOfClass:aClass];
  53. }
  54. - (BOOL)conformsToProtocol:(Protocol *)aProtocol {
  55. return [_target conformsToProtocol:aProtocol];
  56. }
  57. - (BOOL)isProxy {
  58. return YES;
  59. }
  60. - (NSString *)description {
  61. return [_target description];
  62. }
  63. - (NSString *)debugDescription {
  64. return [_target debugDescription];
  65. }
  66. @end