Kealdish's Studio.

runtime对containsString方法的小改进

字数统计: 376阅读时长: 1 min
2016/02/20 Share

最近做项目过程中版本适配到iOS 7上出现了一点问题,定位分析了一下发现原来是NSstringcontainsString:方法在从中作梗。看了一下文档发现原来containsString:是从iOS 8才加入的,iOS 7 SDK并没有该方法。这个问题解决起来也挺简单的,在iOS 7下可以用如下代码代替containsString:方法:

1
BOOL isContained = [aString rangeOfString:bString].location != NSNotFound

不过,我觉得要在每一个需要调用containsString:方法写一遍有点麻烦,把适配的代码抽离出来写入一个方法倒是可以,但我还是觉得有点麻烦,毕竟懒癌患者。于是,我想到了用runtime运行时机制动态添加containsString:方法就可以一劳永逸了。
实现的原理也很简单,在iOS 7下判断NSString中是否存在containsString:实例方法,若不存在,则动态添加该方法。这样就不用再需要调用containsString:实例方法去判断了。原理很简单,代码也很简单,还是很符合我这个懒癌患者的口味的嘛。

1
2
3
4
5
6
7
8
9
10
11
12
13
// NSString+containsStringCategory.h
#import <Foundation/Foundation.h>
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
@interface NSString (containsStringCategory)
- (BOOL)containsString:(NSString *)str;
@end
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// NSString+containsStringCategory.m
#import "NSString+containsStringCategory.h"
#import <objc/runtime.h>
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
@implementation NSString (containsStringCategory)
+ (void)load{
@autoreleasepool {
[self zs_modernizeSelector:@selector(containsString:) withSelector:@selector(zs_containsString:)];
}
}
+ (void)zs_modernizeSelector:(SEL)originSelector withSelector:(SEL)newSelector{
if (![NSString instancesRespondToSelector:originSelector]) {
Method newMethod = class_getInstanceMethod(self, newSelector);
class_addMethod(self, originSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod));
}
}
- (BOOL)zs_containsString:(NSString *)str{
return [self rangeOfString:str].location != NSNotFound;
}
@end
#endif
CATALOG