NSMutableString+Safe.m 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //
  2. // NSMutableString+Safe.m
  3. // MSYOUPAI
  4. //
  5. // Created by YoMi on 2023/11/7.
  6. //
  7. #import "NSMutableString+Safe.h"
  8. #import "NSObject+Swizzling.h"
  9. #import <objc/runtime.h>
  10. @implementation NSMutableString (Safe)
  11. #pragma mark --- init method
  12. + (void)load {
  13. //只执行一次这个方法
  14. static dispatch_once_t onceToken;
  15. dispatch_once(&onceToken, ^{
  16. // 替换 substringFromIndex:
  17. NSString *tmpSubFromStr = @"substringFromIndex:";
  18. NSString *tmpSafeSubFromStr = @"safeMutable_substringFromIndex:";
  19. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSCFString")
  20. originalSelector:NSSelectorFromString(tmpSubFromStr) swizzledSelector:NSSelectorFromString(tmpSafeSubFromStr)];
  21. // 替换 substringToIndex:
  22. NSString *tmpSubToStr = @"substringToIndex:";
  23. NSString *tmpSafeSubToStr = @"safeMutable_substringToIndex:";
  24. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSCFString")
  25. originalSelector:NSSelectorFromString(tmpSubToStr) swizzledSelector:NSSelectorFromString(tmpSafeSubToStr)];
  26. // 替换 substringWithRange:
  27. NSString *tmpSubRangeStr = @"substringWithRange:";
  28. NSString *tmpSafeSubRangeStr = @"safeMutable_substringWithRange:";
  29. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSCFString")
  30. originalSelector:NSSelectorFromString(tmpSubRangeStr) swizzledSelector:NSSelectorFromString(tmpSafeSubRangeStr)];
  31. // 替换 rangeOfString:options:range:locale:
  32. NSString *tmpRangeOfStr = @"rangeOfString:options:range:locale:";
  33. NSString *tmpSafeRangeOfStr = @"safeMutable_rangeOfString:options:range:locale:";
  34. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSCFString")
  35. originalSelector:NSSelectorFromString(tmpRangeOfStr) swizzledSelector:NSSelectorFromString(tmpSafeRangeOfStr)];
  36. // 替换 appendString
  37. NSString *tmpAppendStr = @"appendString:";
  38. NSString *tmpSafeAppendStr = @"safeMutable_appendString:";
  39. [NSObject exchangeInstanceMethodWithSelfClass:NSClassFromString(@"__NSCFString")
  40. originalSelector:NSSelectorFromString(tmpAppendStr) swizzledSelector:NSSelectorFromString(tmpSafeAppendStr)];
  41. });
  42. }
  43. #pragma mark --- implement method
  44. /**************************************** substringFromIndex: ***********************************/
  45. /**
  46. 从from位置截取字符串 对应 __NSCFString
  47. @param from 截取起始位置
  48. @return 截取的子字符串
  49. */
  50. - (NSString *)safeMutable_substringFromIndex:(NSUInteger)from {
  51. if (from > self.length ) {
  52. return nil;
  53. }
  54. return [self safeMutable_substringFromIndex:from];
  55. }
  56. /**************************************** substringFromIndex: ***********************************/
  57. /**
  58. 从开始截取到to位置的字符串 对应 __NSCFString
  59. @param to 截取终点位置
  60. @return 返回截取的字符串
  61. */
  62. - (NSString *)safeMutable_substringToIndex:(NSUInteger)to {
  63. if (to > self.length ) {
  64. return nil;
  65. }
  66. return [self safeMutable_substringToIndex:to];
  67. }
  68. /*********************************** rangeOfString:options:range:locale: ***************************/
  69. /**
  70. 搜索指定 字符串 对应 __NSCFString
  71. @param searchString 指定 字符串
  72. @param mask 比较模式
  73. @param rangeOfReceiverToSearch 搜索 范围
  74. @param locale 本地化
  75. @return 返回搜索到的字符串 范围
  76. */
  77. - (NSRange)safeMutable_rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch locale:(nullable NSLocale *)locale {
  78. if (!searchString) {
  79. searchString = self;
  80. }
  81. if (rangeOfReceiverToSearch.location > self.length) {
  82. rangeOfReceiverToSearch = NSMakeRange(0, self.length);
  83. }
  84. if (rangeOfReceiverToSearch.length > self.length) {
  85. rangeOfReceiverToSearch = NSMakeRange(0, self.length);
  86. }
  87. if ((rangeOfReceiverToSearch.location + rangeOfReceiverToSearch.length) > self.length) {
  88. rangeOfReceiverToSearch = NSMakeRange(0, self.length);
  89. }
  90. return [self safeMutable_rangeOfString:searchString options:mask range:rangeOfReceiverToSearch locale:locale];
  91. }
  92. /*********************************** substringWithRange: ***************************/
  93. /**
  94. 截取指定范围的字符串 对应 __NSCFString
  95. @param range 指定的范围
  96. @return 返回截取的字符串
  97. */
  98. - (NSString *)safeMutable_substringWithRange:(NSRange)range {
  99. if (range.location > self.length) {
  100. return nil;
  101. }
  102. if (range.length > self.length) {
  103. return nil;
  104. }
  105. if ((range.location + range.length) > self.length) {
  106. return nil;
  107. }
  108. return [self safeMutable_substringWithRange:range];
  109. }
  110. /*********************************** safeMutable_appendString: ***************************/
  111. /**
  112. 追加字符串 对应 __NSCFString
  113. @param aString 追加的字符串
  114. */
  115. - (void)safeMutable_appendString:(NSString *)aString {
  116. if (!aString) {
  117. return;
  118. }
  119. return [self safeMutable_appendString:aString];
  120. }
  121. @end