NSArray+Safe.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // NSArray+Safe.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2023/11/7.
  6. //
  7. #import "NSArray+Safe.h"
  8. #import "NSObject+Swizzling.h"
  9. @implementation NSArray (Safe)
  10. #pragma mark --- init method
  11. + (void)load {
  12. //只执行一次这个方法
  13. static dispatch_once_t onceToken;
  14. dispatch_once(&onceToken, ^{
  15. //替换 objectAtIndex
  16. NSString *tmpStr = @"objectAtIndex:";
  17. NSString *tmpFirstStr = @"safe_ZeroObjectAtIndex:";
  18. NSString *tmpThreeStr = @"safe_objectAtIndex:";
  19. NSString *tmpSecondStr = @"safe_singleObjectAtIndex:";
  20. // 替换 objectAtIndexedSubscript
  21. NSString *tmpSubscriptStr = @"objectAtIndexedSubscript:";
  22. NSString *tmpSecondSubscriptStr = @"safe_objectAtIndexedSubscript:";
  23. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSArray0")
  24. originalSelector:NSSelectorFromString(tmpStr) swizzledSelector:NSSelectorFromString(tmpFirstStr)];
  25. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSSingleObjectArrayI")
  26. originalSelector:NSSelectorFromString(tmpStr) swizzledSelector:NSSelectorFromString(tmpSecondStr)];
  27. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSArrayI")
  28. originalSelector:NSSelectorFromString(tmpStr) swizzledSelector:NSSelectorFromString(tmpThreeStr)];
  29. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSArrayI")
  30. originalSelector:NSSelectorFromString(tmpSubscriptStr) swizzledSelector:NSSelectorFromString(tmpSecondSubscriptStr)];
  31. });
  32. }
  33. #pragma mark --- implement method
  34. /**
  35. 取出NSArray 第index个 值 对应 __NSArrayI
  36. @param index 索引 index
  37. @return 返回值
  38. */
  39. - (id)safe_objectAtIndex:(NSUInteger)index {
  40. if (index >= self.count){
  41. return nil;
  42. }
  43. return [self safe_objectAtIndex:index];
  44. }
  45. /**
  46. 取出NSArray 第index个 值 对应 __NSSingleObjectArrayI
  47. @param index 索引 index
  48. @return 返回值
  49. */
  50. - (id)safe_singleObjectAtIndex:(NSUInteger)index {
  51. if (index >= self.count){
  52. return nil;
  53. }
  54. return [self safe_singleObjectAtIndex:index];
  55. }
  56. /**
  57. 取出NSArray 第index个 值 对应 __NSArray0
  58. @param index 索引 index
  59. @return 返回值
  60. */
  61. - (id)safe_ZeroObjectAtIndex:(NSUInteger)index {
  62. if (index >= self.count){
  63. return nil;
  64. }
  65. return [self safe_ZeroObjectAtIndex:index];
  66. }
  67. /**
  68. 取出NSArray 第index个 值 对应 __NSArrayI
  69. @param idx 索引 idx
  70. @return 返回值
  71. */
  72. - (id)safe_objectAtIndexedSubscript:(NSUInteger)idx {
  73. if (idx >= self.count){
  74. return nil;
  75. }
  76. return [self safe_objectAtIndexedSubscript:idx];
  77. }
  78. @end