进行字符串搜索比对时用到的方法 containsString,在iOS7中运行时发生崩溃:
-[NSCFString containsString:]: unrecognized selector sent to instance 0x7f9902724da0
查询API文档可知containsString的定义如下
- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);
从中可以看到 containsString 是iOS8中才出现的API,所以在小于iOS8的系统中运行将导致程序崩溃。
解决方法:
<1>.判定系统版本,当系统版本号大于或等于8.0时才用containsString,否则采用原始判定方式rangeOfString;
<2>.直接使用rangeOfString,实际上containsString就是rangeOfString的一个简单封装;
下面做一个简单测试
NSString *str = @"ddd"; NSString *str2 = nil; NSLog(@"%d", [str containsString: str2]);</span>运行后程序将崩溃
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFConstantString rangeOfString:options:range:locale:]: nil argument'我们看到了,containsString 调用了rangeOfString。
<3>.使用Category给NSString增添新的方法containsString,覆盖掉系统的方法;
NSString+MyTools.h
#import <Foundation/Foundation.h> @interface NSString (MyTools) - (BOOL)containsString:(NSString *)str; @end
NSString+MyTools.m
#import "NSString+MyTools.h" @implementation NSString (MyTools) - (BOOL)containsString:(NSString *)str{ return [self rangeOfString: str].location != NSNotFound; } @end由于rangeOfString使用起来有点小复杂,在iOS8对其进行简单封装诞生了containsString,用起来简单方便,但是为了程序的兼容性,需要做一些处理工作。