进行字符串搜索比对时用到的方法 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,用起来简单方便,但是为了程序的兼容性,需要做一些处理工作。

本文介绍在iOS开发中如何正确使用containsString方法,并提供了解决该方法在不同iOS版本间兼容性的几种方案。

被折叠的 条评论
为什么被折叠?



