最近做项目过程中版本适配到iOS 7上出现了一点问题,定位分析了一下发现原来是NSstring
的containsString:
方法在从中作梗。看了一下文档发现原来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
| #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
| #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
|